在java正则表达式中匹配'_'和' - '

时间:2010-01-23 00:44:03

标签: java regex

我在 java 中有这个正则表达式,它匹配字母数字字符或代字号(〜)

^([a-z0-9])+|~$

现在我还要添加字符-_我尝试了一些组合,但两者都不起作用,例如:

^([a-zA-Z0-9_-])+|~$ ^([a-zA-Z0-9]|-|_)+|~$

必须匹配的示例输入字符串:

woZOQNVddd

00000

ncnW0mL14 -

dEowBO_Eu7

7MyG4XqFz -

A8ft-y6hDu 〜

任何线索/建议?

3 个答案:

答案 0 :(得分:7)

-是方括号内的特殊字符。它表示一个范围。如果它不在正则表达式的任何一端,则需要通过在其前面放置\来进行转义。

值得指出一条捷径:\w相当于[0-9a-zA-Z_]所以我认为这更具可读性:

^([\w-]+|~$

答案 1 :(得分:3)

您需要转义-,例如\-,因为它是一个特殊字符(范围运算符)。 _没问题。

所以^([a-z0-9_\-])+|~$

编辑:您的上一个输入字符串将不匹配,因为您使用的正则表达式匹配一串字母数字字符(加-_)或波浪号(因为管道)。但不是两个。如果要在末尾允许选项波形符,请更改为:

^([a-z0-9_\-])+(~?)$

答案 2 :(得分:3)

如果先放置-,则不会将其解释为范围指示符。

^([-a-zA-Z0-9_])+|~$

使用以下代码匹配除最后一个示例之外的所有示例:

String str = "A8ft-y6hDu ~";
System.out.println("Result: " + str.matches("^([-a-zA-Z0-9_])+|~$"));

最后一个示例不匹配,因为它不符合您的描述。正则表达式将匹配任何字母数字组合, - 和_,或一个〜字符。