0

任何人都可以帮助我使用正则表达式来验证字符串是否同时包含数字和非数字字符?

我正在使用"\d+\D+",但它不起作用。我有的测试用例是:

a1
1a
a1b
1ab
ab1
1-2
12-
-12

我列出的测试用例都应该匹配。我正在使用 javascript RegExp.test() 所以 999 或 asdf 或 _+sdf 不匹配。

4

4 回答 4

3

您当前的正则表达式仅匹配一个或多个数字的字符串,后跟一个或多个非数字。您可以使用前瞻来检查数字是否存在:

"(?=.*\d).*\D.*"

(?=.*\d)部分的意思是“在此之后的某个地方,必须有零个或多个任何字符后跟一个数字。” 这允许您的数字出现在字符串中的任何位置。

.*\D.*部分的意思是“匹配零个或多个任何字符,然后是一个非数字,然后是零个或多个任何字符”,它将匹配字符串中任何位置的非数字和其余字符(数字或不) 周围。

于 2013-08-14T17:59:25.980 回答
2

您可以尝试使用前瞻

.*(?=.*\d)(?=.*\D).*

但也许你甚至不需要正则表达式?根据您使用的语言/工具,您可能可以执行以下操作:

  • 让您的输入字符串为s. 如果s为空,则无效。
  • 如果 的第一个字符s是数字:
    • 循环遍历 的其他字符,s直到找到一个非数字。如果没有找到非数字,s则无效。
  • 否则:
    • 循环遍历 的其他字符,s直到找到一个数字。如果找不到数字,s则无效。
  • 如果你找到了合适的数字/非数字,s是有效的。
于 2013-08-14T17:58:38.507 回答
1

这对我有用。它是( match1 | match2 )其中| 表示OR

(\d+[a-zA-Z]+|[a-zA-Z]+\d+)
于 2013-08-14T18:07:10.210 回答
0

如果您的意思是数字和非数字(任何非数字字符),您可以将字符类\d用于 digit ,\D这意味着[^\d]. 不过,这里不需要环顾四周。如果您指的是数字和字母,则可以使用以下内容。我正在为比较字符串爆炸你的字符串。我正在使用带有|运算符的组来允许字母前的数字,反之亦然。

<?php

$string = 'a1 1a a1b 1ab ab1 1-2 12- -12';
$strings = explode(' ',$string);

$pattern = '!([0-9][A-Za-z]|[A-Za-z][0-9])!';

foreach($strings as $tempString){
   if(preg_match($pattern,$tempString)){
      echo "$tempString matches\n";   
   } else {
      echo "$tempString doesn't match\n";      
   }
}


?>

输出

a1 matches
1a matches
a1b matches
1ab matches
ab1 matches
1-2 doesn't match
12- doesn't match
-12 doesn't match

如果我们更改为\d\D字符类,一切都匹配。

$pattern = '!(\d\D|\D\d)!';

输出

a1 matches
1a matches
a1b matches
1ab matches
ab1 matches
1-2 matches
12- matches
-12 matches
于 2013-08-14T18:10:57.890 回答