正则表达式:只匹配字母数字组合,但不包括纯数字。

16
例如:
'1'     => NG
'243'   => NG
'1av'   => OK
'pRo'   => OK
'123k%' => NG

我尝试过

 /^(?=^[^0-9]*$)(?=[a-zA-Z0-9]+)$/

但它的表现并不是很好。

7个回答

30

使用

/^(?![0-9]*$)[a-zA-Z0-9]+$/

该表达式使用负向先行断言来验证字符串不仅仅是数字。在RegExr上可以查看其实际效果。


在regexr中这个可以工作,但是在Java中使用Validation @Pattern(regex="...")对我来说不起作用。也许这并不适用于所有的正则表达式实现? - Michael

13

所以我们知道在其中必须至少有一个“字母”字符:

[a-zA-Z]

它可以在前面或后面带有任意数量的字母数字字符(包括零),因此我们在两侧都使用 [a-zA-Z0-9]* 进行填充:

/^[a-zA-Z0-9]*[a-zA-Z][a-zA-Z0-9]*$/

那应该就可以了。


有没有一种简单的方法来限制这个表达式的字符串长度? - zygimantus
@zygimantus 不是这个表达式,因为总长度可以在这个表达式的两个(/三个)部分中以多种方式拆分。你可以更容易地使用已接受的答案(将+替换为例如{1,80},用于少于80个字符的行);但是说正则表达式是验证长度的不良工具,如果可能的话,我会直接检查它(例如line.length() < 80)然后匹配正则表达式。 - Andrzej Doyle
谢谢回复,是的,我也这么想,直接在代码中检查字符串的长度。 - zygimantus

4

请尝试以下操作:

/^(?!^\d*$)[a-zA-Z\d]*$/

编辑: 由于本质上与已接受的答案相同,我会给你一些不同的内容:

/^\d*[a-zA-Z][a-zA-Z\d]*$/

没有向前查找,也没有重复的复杂组,它只验证是否至少有一个字母字符。这应该非常快。


第二个效果不错,它只排除数字,谢谢!但它仍然不能只排除字母。 - Pavitar

1
尝试使用以下代码:^(?!\d+\b)[a-zA-Z\d]+$
(?!\d+\b) 将避免纯数字,添加 \w+ 然后混合字母和数字。

感谢您的评论,它应该改为^(?!\d+\b)[a-zA-Z\d]+$。 - godspeedlee
你可以编辑你的回答。如果你这样做了,我会给你一个加1的赞。 - MaxArt
1
实际上,\b 是一个好主意。有了它,正则表达式测试会在无效字符串(如“123#test”)之前失败,因为先行断言首先失败。使用 $ 先行断言不会失败。 - MaxArt

0

这是严格的字母数字

String name="^[^a-zA-Z]\\d*[a-zA-Z][a-zA-Z\\d]*$";

0
请尝试使用以下正则表达式:^[a-zA-Z0-9]*[a-zA-Z]+[a-zA-Z0-9]*$

请考虑编辑您的帖子,添加更多关于代码的解释以及为什么它可以解决问题的说明。一个主要只包含代码(即使它是有效的)的答案通常不能帮助提问者理解他们的问题。 - SuperBiasedMan

0

这应该可以解决问题,而不需要使用lookbehind:

^(\d*[a-zA-Z]\d*)+$

尝试不使用捕获组。顺便说一下,Javascript仅支持向前查看。 - MaxArt

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