我正在尝试使用正则表达式来检查字符串中的字母和数字,但如果字符串只包含字母,则它不应该匹配。这是一个javascript代码。应该使用先行吗?
应匹配: 1234567 a1b2c3d4e5 1a2b3c4d5e
不应该匹配: ABCDEFG
编辑:感谢@balsick已回答此问题。这是要使用的正则表达式 - (([a-zA-Z0-9] + \ d + [a-zA-Z0-9] )|(\ d + [a-zA-Z0-9] + \ d ))+
我确实有一个后续问题:可以在此正则表达式中添加长度约束吗?例如:我想只匹配10-20个字母/数字的字符串。
答案 0 :(得分:4)
试试这个:
((\w+\d+\w*)|(\d+\w+\d*))+
\ w查找字母
\ d查找数字
+表示至少一个
*表示零或更多
|是运算符
我为您的主要问题找到了更好的解决方案。它比@balsick的解决方案更短更快,并且它不会捕获_
字符:
([a-zA-Z]*\d[a-zA-Z]*)+
你希望限制字符串的长度很难用正则表达式来克服。有一些选项可以限制匹配数量。例如:
a{5}
,a{2,}
正好是五个,两个或更多
a{1,3}
3
但这不适用于上层正则表达式,因为每个子匹配都是
如果您有a1b2c3d4e5
之类的匹配项,则其中包含以下子代码:a1b
2c
3d
4e
5
虽然匹配由10个字符组成,但使用量词{10,20}
代替最后一个加号不会起作用,因为实际的子匹配数将是5而不是10。
我认为你必须使用上层正则表达式,之后以编程方式检查每个匹配项的长度。
伪代码:
foreach (var match in matches) {
if (match.Value.length < 21 && match.Value.length > 9) {
doSomething();
}
}
或者,如果您有可能使用Linq,您可以这样做:
var filteredMatches = matches.Filter(match => match.Value.length < 21 && match.Value.length > 9)
答案 1 :(得分:2)
您可以断言字符串^
的开头,使用带有alternation的非捕获组(?:
来匹配数字\d
或|
一个或多个字符后跟数字[a-z]+\d
。这可以确保您至少有一位数字,并且您也可以从字符开始。
然后,对于正则表达式的最后一部分,您可以匹配零个或多个数字和字符[a-z\d]*
,直到字符串$
结束。
要匹配大写和小写字符,您可以将[a-z]
与不区分大小写的标记/i
let pattern = /^(?:\d|[a-z]+\d)[a-z\d]*$/i;
const strings = [
"a1b2c3d4e5",
"1a2b3c4d5e",
"abcdefg",
"1234567"
];
strings.forEach((s) => {
console.log(s + " ==> " + pattern.test(s));
});
&#13;
如果你想确保你的匹配包含10 - 20个字母数字字符,你可以使用正向前瞻:
^(?=[a-z\d]*\d)[a-z\d]{10,20}$
let pattern = /^(?=[a-z\d]*\d)[a-z\d]{10,20}$/i;
const strings = [
"a1b2c3d4e5",
"1a2b3c4d5e",
"1234567",
"abcdefg",
"1234567",
"12112121121fffdfdfdfdfdfdfd",
"fdfddfdfdffdfdf5ffrtgr54f345f453f3ff"
];
strings.forEach((s) => {
console.log(s + " ==> " + pattern.test(s));
});
&#13;
答案 2 :(得分:0)