正则表达式:仅匹配字母和数字

13

我该如何创建一个正则表达式,它只匹配包含字母数字的字符串?

我尝试了类似这样的表达式:(?>[A-z]+)([a-z0-9]+)

这个正则表达式应该返回以下结果:

1234b --> true
1234 --> false
abcd --> false
abcd4 --> true
12b34 --> true

3
很好奇为什么这个问题被踩了... - sleepsort
1a2a1b应该发生什么? - Dio F
1
在你的情况下,é 是一个字母吗?你知道 [A-z] 也会匹配像 | 这样的字符吗?你正在使用哪个正则表达式引擎? - Tim Pietzcker
4个回答

14

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

基本上,其中1和a是任何数字和任何字母,它匹配由任何数量的字母数字字符包围的1a或a1。

编辑:现在更短,可能更快。


这正是我寻找了3个小时的内容,而且我还提供了示例 https://regex101.com/r/vU9aU9/1 - Sunny

6

其他答案是不正确的,它们将允许任何仅包含字母、数字或两者的字符串。我的表达式将特别排除仅由字母或仅由数字组成的字符串。

[A-Za-z0-9]*([a-zA-Z]+[0-9]+|[0-9]+[a-zA-Z]+)

任意数量的字母和数字,后面至少跟着一个字母再跟着一个数字或者至少一个数字再跟着一个字母。

然而可能有更简单的方法。我的看起来有些冗长。也许不是这样的。有人想为此提供帮助吗?:P


谢谢,就这样!其实很容易。 - dazzafact
1
参与进来:^(?:[0-9]*[A-Z]|[A-Z]*[0-9])[A-Z0-9]*$。使用您正在使用的任何正则表达式引擎的不区分大小写修饰符。 - Tim Pietzcker
@TimPietzcker 实际上不起作用:echo 'a1b2' | grep -o -E "(?:[0-9]*[A-Z]|[A-Z]*[0-9])[A-Z0-9]*$" - sleepsort
@TimPietzcker 哦,我的错,我会修复它。但我们假设这个人想要匹配 'a1b2'? - sleepsort
2
@billybob:糟糕,你是对的,我犯了一个错误:应该是“^(?:[0-9]+[A-Z]|[A-Z]+[0-9])[A-Z0-9]*$”。抱歉。 - Tim Pietzcker

1

^([a-Z]+[0-9]+|[0-9]+[a-Z]+)[a-Z0-9]*$

还有一个受TimPietzcker启发的简化版本:

^([a-Z]+[0-9]|[0-9]+[a-Z])[a-Z0-9]*$


几乎正确了!看到了一个ERE解决方案很好(因为这是一个简单的问题,不应该需要PCRE)。但是,根据您的解析器,[a-Z]可能与[A-Za-z]的含义不同。 - ghoti
@dazzafact 在我回答时他更新了他的解决方案 :) - sleepsort
当可能的最佳解范围很小时,重叠是几乎确定的 :) - marcus erronius

0

如果不必要,就不要只使用一个正则表达式。使用两个必须都匹配的正则表达式。在Perl中,可以这样写:

if ( /[a-zA-Z]/ && /\d/ ) 

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接