如何将模式与字母和数字匹配,但如果仅包含字母表则不匹配?

时间:2018-05-11 15:58:43

标签: javascript regex

我正在尝试使用正则表达式来检查字符串中的字母和数字,但如果字符串只包含字母,则它不应该匹配。这是一个javascript代码。应该使用先行吗?

应匹配: 1234567 a1b2c3d4e5 1a2b3c4d5e

不应该匹配: ABCDEFG

编辑:感谢@balsick已回答此问题。这是要使用的正则表达式 - (([a-zA-Z0-9] + \ d + [a-zA-Z0-9] )|(\ d + [a-zA-Z0-9] + \ d ))+

我确实有一个后续问题:可以在此正则表达式中添加长度约束吗?例如:我想只匹配10-20个字母/数字的字符串。

3 个答案:

答案 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

但这不适用于上层正则表达式,因为每个子匹配都是

  • 一个或多个字母与数字组合: aa1
  • 与一个或多个字母组合的数字,例如: 1aaa
  • 一个或多个字母与数字和一个或多个字母组合,如: a1aa
  • 或单个数字,如: 1

如果您有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

一起使用

^(?:\d|[a-z]+\d)[a-z\d]*$

&#13;
&#13;
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;
&#13;
&#13;

如果你想确保你的匹配包含10 - 20个字母数字字符,你可以使用正向前瞻:

^(?=[a-z\d]*\d)[a-z\d]{10,20}$

&#13;
&#13;
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;
&#13;
&#13;

答案 2 :(得分:0)

使用@balsick

的输入更新了答案

使用前瞻性Regex:

^(?=[A-Za-z\d]*\d)[A-Za-z\d]*$

Demo