有人可以帮助我使用正则表达式验证字符串是否同时包含数字和非数字字符?
我正在使用"\d+\D+"
,但它不起作用。我的测试用例是:
a1
1a
a1b
1ab
ab1
1-2
12-
-12
我列出的测试用例都应该匹配。我正在使用javascript RegExp.test()所以999或asdf或_ + sdf不匹配。
答案 0 :(得分:3)
您当前的正则表达式只匹配一个或多个数字的字符串,后跟一个或多个非数字。您可以使用前瞻来检查是否存在数字:
"(?=.*\d).*\D.*"
(?=.*\d)
部分的意思是“在此之后的某个地方,必须有零个或多个字符后跟一个数字。”这允许您的数字出现在字符串中的任何位置。
.*\D.*
部分表示“匹配任何字符的零或更多,然后是任何字符的非数字,然后是零或更多”,这将匹配字符串中任何位置的非数字和围绕它的其余字符(数字或不是)。
答案 1 :(得分:2)
您可以尝试使用lookaheads:
.*(?=.*\d)(?=.*\D).*
但也许你甚至不需要正则表达式?根据您使用的语言/工具,您可以执行以下操作:
s
。如果s
为空,则无效。s
的第一个字符是数字:
s
的其他字符,直到找到非数字。如果您没有找到非数字,s
无效。s
的其他字符,直至找到数字。如果找不到数字,s
无效。s
有效。答案 2 :(得分:1)
这对我有用。 它是( match1 | match2 ),其中 | 表示 OR 。
(\d+[a-zA-Z]+|[a-zA-Z]+\d+)
答案 3 :(得分:0)
如果您指(任何非数字字符),您可以使用数字和非数字来表示数字\d
和\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