正则表达式:如何匹配不仅是数字的字符串

Svi*_*ish 30 regex

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

  • ABC
  • A4C
  • 公元前4年
  • AB4
  • 123

它应该匹配前四个,但不是最后一个.我试图在RegexBuddy中用前瞻和东西摆弄,但我似乎无法弄明白.

Mik*_*eel 42

(?!^\d+$)^.+$
Run Code Online (Sandbox Code Playgroud)

这表示不包含所有数字并与整行匹配的行的前瞻.

  • 所以...基本上你想出了一个复杂的 /\D/ 表达式。 (2认同)
  • 好吧,没有 \D 与我的不同,因为它只匹配非数字。当进行匹配时,我的返回包含整个字符串的匹配项,而 \D 可能是每行多个匹配项。我的正则表达式返回 4 个匹配项,而 \D 返回 17 个(对于每个非数字)。 (2认同)
  • @Daniel,我的问题怎么说不清楚?我甚至有5个例子,我标记了我想要匹配的字符串...... (2认同)

Dan*_*age 12

除非我遗漏了什么,否则我认为最简洁的正则表达式是......

/\D/
Run Code Online (Sandbox Code Playgroud)

...或者换句话说,字符串中是否有一个非数字?

  • 据我所知,如果字符串中有数字,这将失败 (2认同)
  • 我做到了。这与不包含数字的字符串不匹配。它匹配非数字的单个字母。如果我把它放在 ^ 和 $ 之间来匹配字符串,它只匹配我的测试字符串的第一个。 (2认同)

luc*_*nov 7

/^\d*[a-z][a-z\d]*$/
Run Code Online (Sandbox Code Playgroud)

可以是开头的数字,然后至少一个字母,然后是字母或数字

  • 这是迄今为止最容易阅读和理解的内容. (2认同)

Jos*_*e_X 7

jjnguy在早期版本中对它进行了更正(如果稍微冗余).

.*?[^0-9].*
Run Code Online (Sandbox Code Playgroud)

@Chad,你的正则表达式,

\b.*[a-zA-Z]+.*\b
Run Code Online (Sandbox Code Playgroud)

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

\b.*[^0-9]+.*\b
Run Code Online (Sandbox Code Playgroud)

然后,你不需要+ in,因为你需要的只是保证在那里有一个非数字(更多可能在那里,由两端的.*覆盖).

\b.*[^0-9].*\b
Run Code Online (Sandbox Code Playgroud)

接下来,您可以取消两端的\ b,因为这些是不必要的约束(调用对alphanum和_的引用).

.*[^0-9].*
Run Code Online (Sandbox Code Playgroud)

最后,请注意,最后一个正则表达式表明问题可以通过基础知识解决,这些基础知识已经存在了几十年(例如,不需要预见功能).在英语中,问题在逻辑上等同于简单地要求在字符串中找到1个反例示例字符.

我们可以在浏览器中测试这个正则表达式,方法是将以下内容复制到位置栏中,将字符串"6576576i7567"替换为您要测试的内容.

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