2010-09-30 32 views
23

是否可以写一点不只有包含数字的所有字符串相匹配的正则表达式?如果我们有这些字符串:正则表达式:如何匹配一个字符串,它不仅是数字

  • ABC
  • A4C
  • 4BC
  • AB4

应该匹配ŧ他四个第一,但不是最后一个。我曾尝试摆弄周围在使用RegexBuddy与向前看符号之类的东西,但我似乎无法弄清楚。

回答

31
(?!^\d+$)^.+$ 

这表示对于不包含所有数字并且与整条线匹配的行的向前看。

+0

这基本上是我结束了:) – Svish 2010-10-01 09:58:18

+1

所以......基本上你想出了一个复杂的表达式/ \ D /。 – 2010-10-01 18:06:43

+1

好吧,没有\ D与我的不同,因为它只匹配非数字。矿场返回包含整个字符串的匹配项,而只有\ D可能是每行多个匹配项。我的正则表达式返回4个匹配,而\ D返回17(对于每个非数字)。 – 2010-10-01 19:20:08

5
/^\d*[a-z][a-z\d]*$/ 

可能在一开始有一个数字,那么至少有一个字母,然后字母或数字

+2

这是迄今为止最容易阅读和理解。 – enyo 2016-12-14 18:14:45

9

除非我失去了一些东西,我觉得最简洁的正则表达式是...

/\D/ 

...或者换句话说,有没有不位数的字符串中?

+0

如果字符串中有一个数字,就会失败 – Svish 2010-10-01 09:56:19

+0

@Svish:你的陈述没有意义。 – SilentGhost 2010-10-01 11:06:37

+0

@Svish,也许你应该在说些什么之前真正尝试一下。它比您选择的答案简洁得多,而且确实有效。如果字符串中有数字,它不会失败,如果它找不到“非数字”,它就会失败,这正是你所要求的。 – 2010-10-01 13:47:11

2

既然你说 “比赛”,不仅验证,下面的正则表达式匹配正确

\b.*[a-zA-Z]+.*\b 

通过的测试:

abc 
a4c 
4bc 
ab4 
1b1 
11b 
b11 

失败的测试:

123 
+0

可以'\ b。* \ D +。* \ b'工作吗? – 2012-10-18 08:07:52

+1

@Jin,取决于,'[a-zA-Z]'与'\ D'不一样。 '\ D'是“不是一个数字”。所以如果他们真的不想要0-9并且符合标点符号,那么是的,'\ D'会更准确。 – CaffGeek 2012-10-18 13:03:09

6

jjnguy在中正确(如果略有冗余)。

.*?[^0-9].* 

@Chad,您正则表达式,

\b.*[a-zA-Z]+.*\b 

也许应该允许非字母(如标点符号),即使Svish的例子并不包括一个。 Svish的主要要求是:并非所有人都是数字。

\b.*[^0-9]+.*\b 

然后,你不需要+在那里,因为所有你需要的是保证1个非数字是在那里(更可能是在那里作为涵盖的。*的结束)。接下来,由于这些是不必要的约束(调用对alphanum和_的引用),因此您可以在两端删除\ b。

.*[^0-9].* 

最后请注意,这最后的正则表达式显示问题只带有基本得到解决,那些已经存在了几十年基础(例如,无需先行功能)。在英语中,这个问题在逻辑上等同于简单地要求在一个字符串中找到1个反例字符。

我们可以在浏览器中测试这个正则表达式,方法是将以下内容复制到地址栏中,将字符串“6576576i7567”替换为您想测试的任何字符串。

javascript:alert(new String("6576576i7567").match(".*[^0-9].*")); 
0

如果我们想限制有效字符,使字符串可以从一组有限的字符进行,试试这个:

(?!^\d+$)^[a-zA-Z0-9_-]{3,}$ 

(?!^\d+$)^[\w-]{3,}$ 

/\ w + /: 匹配任何字母,数字或下划线。任何单词字符

2

试试这个:

/^.*\D+.*$/ 

,如果有任何辛博尔返回true,这不是一个数字。适用于所有语言。

2

,如果你想匹配至少有一个字母的世界,但它们是由数字和字母(或只是字母)形成的,这是我用什么:

(\d*[a-zA-Z]+\d*)+ 
相关问题