Java正则表达式将@放在字符类中

时间:2014-05-29 14:04:24

标签: java regex

我正在使用以下代码来评估Java中的正则表达式,它的工作正常。

public class RegExTest {

  public RegExTest() {
  }

  public static void main(String[] args) {
      Pattern pattern = Pattern.compile("[^A-Za-z0-9/.@_-]");
      Matcher matcher = pattern.matcher("john.connor3@resistance-aloha.net");
      System.out.println(matcher.find());

  }

}

但是当我将regexp上方的'@'符号移到字符组的末尾时,就像在

中一样
[^A-Za-z0-9/._-@]

,我得到以下异常:

java.util.regex.PatternSyntaxException: Illegal character range near index 15
[^A-Za-z0-9/._-@]
               ^

为什么字符组中'@'字符的位置是相关的,如果'@'字符在结束']'之前出现,正则表达式如何导致异常?

3 个答案:

答案 0 :(得分:2)

这是因为连字符(-)需要在这里转义。

[^A-Za-z0-9/._\\-@]

在字符类中,您可以将连字符设置为范围中的第一个最后一个字符。如果您将连字符放在其他任何地方,您需要将其转义以便匹配。

答案 1 :(得分:2)

这不是@问题,而是连字符(-)。

在类([])中,连字符定义范围,例如a-z

在您的第二个实例中,_@之间的范围当然无效,因此错误。

如果您需要:\\-,则可以转义连字符以解决此问题。

答案 2 :(得分:1)

-是字符类中的特殊字符,表示范围。

因此,您的正则表达式包含无效的范围_-@。你需要逃避-\-

"[^A-Za-z0-9/.@_\\-]"