Javascript 如何将模式与字母和数字相匹配,但如果它只包含字母,则不匹配?

Javascript 如何将模式与字母和数字相匹配,但如果它只包含字母,则不匹配?,javascript,regex,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个字

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

应匹配: 1234567 a1b2c3d4e5 1a2b3c4d5e

不应匹配: abcdefg

编辑:感谢@balsick,这个问题已经得到了回答。这是要使用的正则表达式-[a-zA-Z0-9]+\d+[a-zA-Z0-9]|\d+[a-zA-Z0-9]+\d+

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

试试这个:

((\w+\d+\w*)|(\d+\w+\d*))+
\w查找字母

\d查找数字

+表示至少一个

*表示零或更多

|是or操作员吗

编辑改进 我为你的主要问题找到了更好的解决办法。它比@balsick的解决方案更短更快,而且不会捕捉到uu字符:

([a-zA-Z]*\d[a-zA-Z]*)+
使用正则表达式很难克服限制字符串长度的愿望。有一些选项可以限制匹配的数量。例如:

a{5},a{2,}正好五个,两个或更多

一和三之间的{1,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)
试试这个:

((\w+\d+\w*)|(\d+\w+\d*))+
\w查找字母

\d查找数字

+表示至少一个

*表示零或更多

|是or操作员吗

编辑改进 我为你的主要问题找到了更好的解决办法。它比@balsick的解决方案更短更快,而且不会捕捉到uu字符:

([a-zA-Z]*\d[a-zA-Z]*)+
使用正则表达式很难克服限制字符串长度的愿望。有一些选项可以限制匹配的数量。例如:

a{5},a{2,}正好五个,两个或更多

一和三之间的{1,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)

使用@balsick的输入更新答案

使用lookahead Regex:

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

使用@balsick的输入更新答案

使用lookahead Regex:

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

您可以断言字符串^的开头,使用非捕获组?:与匹配数字\d或|一个或多个字符后跟数字[a-z]+\d。这样可以确保您至少有一个数字,并且还可以以字符开头

然后,对于正则表达式的最后一部分,可以匹配零个或多个数字和字符[a-z\d]*直到字符串$的结尾

要匹配大写和小写字符,可以使用[a-z]和不区分大小写的标志/i

让模式=/^?:\d |[a-z]+\d[a-z\d]*$/i; 常量字符串=[ a1b2c3d4e5, 1a2b3c4d5e, abcdefg, 1234567 ]; strings.forEachs=>{ console.logs+=>+pattern.tests;
}; 您可以断言字符串^的开头,使用非捕获组?:与匹配数字\d或|一个或多个字符后跟数字[a-z]+\d。这样可以确保您至少有一个数字,并且还可以以字符开头

然后,对于正则表达式的最后一部分,可以匹配零个或多个数字和字符[a-z\d]*直到字符串$的结尾

要匹配大写和小写字符,可以使用[a-z]和不区分大小写的标志/i

让模式=/^?:\d |[a-z]+\d[a-z\d]*$/i; 常量字符串=[ a1b2c3d4e5, 1a2b3c4d5e, abcdefg, 1234567 ]; strings.forEachs=>{ console.logs+=>+pattern.tests; };Stack Ov
厄尔福不会很受欢迎的。显示您的尝试并标记语言或工具。这是一个很好的问题,非常适合这样做。我不明白下面的投票…堆栈溢出不会很受欢迎。显示您的尝试并标记语言或工具。这是一个很好的问题,非常适合这样做。我不理解反对票…这实际上并不像你期望的那样有效,因为它还匹配像____3这样的字符串。也许你的意思是^?=[A-Za-z\d]*\d[A-Za-z\d]*$Lookaheads和lookbehinds在时间上很昂贵,并且不是每个编程都支持language@balsick,我同意。请将您的正则表达式作为答案发布,我将删除我的正则表达式。这实际上并不像您期望的那样有效,因为它还匹配像___3这样的字符串。也许你的意思是^?=[A-Za-z\d]*\d[A-Za-z\d]*$Lookaheads和lookbehinds在时间上很昂贵,并且不是每个编程都支持language@balsick,我同意。请将您的正则表达式作为答案发布,我将删除我的正则表达式。它不完全正确,因为您也在考虑。[a-zA-Z0-9]+\d+[a-zA-Z0-9]*|\d+[a-zA-Z0-9]+\d*+更正确谢谢@balsick!这很有魅力。有没有一种方法可以将长度约束添加到您拥有的正则表达式中?例如:我只想匹配那些介于10-20个字母/数字之间的字符串。@anil premkumar我已经更新了我的答案。我不应该在方括号里写我的评论。此外,正则表达式可以这样简化[a-zA-Z]+\d+\d+[a-zA-Z]++这并不完全正确,因为您也在考虑。[a-zA-Z0-9]+\d+[a-zA-Z0-9]*|\d+[a-zA-Z0-9]+\d*+更正确谢谢@balsick!这很有魅力。有没有一种方法可以将长度约束添加到您拥有的正则表达式中?例如:我只想匹配那些介于10-20个字母/数字之间的字符串。@anil premkumar我已经更新了我的答案。我希望这会对你有所帮助。我刚刚意识到我的评论是错误的:方括号中有一个0-9,不应该在那里。此外,正则表达式可以这样简化[a-zA-Z]+\d+\d+[a-zA-Z]++