为什么以下正则表达式[^ 0-9!a-zA-z#\\ $%&'\\ * \\ + \\ - / = \\?\\ ^ _` \\ {\\ | \\ }〜@ \\。] + for String.split无法正常工作?

时间:2012-11-25 22:44:36

标签: java regex

我有这个正则表达式:

[^0-9!a-zA-z#\\$%&'\\*\\+\\-/=\\?\\^_`\\{\\|\\}~@\\.]+

我正在尝试使用

拆分电子邮件地址
[Email]info@emerycommunications.com

但是java中的以下代码:

String fileStr = "[Email]info@emerycommunications.com";

String invalidCharacters = "[^0-9!a-zA-z#\\$%&'\\*\\+\\-/=\\?\\^_`\\{\\|\\}~@\\.]+";

String[] tokens = fileStr.split(invalidCharacters);

for (String token:tokens) {
    if (token.contains("@")) {
        System.out.println(token);
    }
}

正在提供此输出:

[Email]info@emerycommunications.com

我完全不知道invalidCharacters变量涵盖[]

2 个答案:

答案 0 :(得分:7)

您的角色类中有A-z,方括号字符以ASCII(和Unicode)顺序排列在大写字母Z和小写字母a之间。因此,]被视为有效而非无效的字符 - 可能您的意思是A-Z

答案 1 :(得分:4)

这个正则表达式:

[^0-9!a-zA-z#\$%&'\*\+\-/=\?\^_`\{\|\}~@\.]+

匹配至少一个但与任何字符一样多的字符除了之间的方括号。方括号本身不是字符集的一部分。大多数反斜杠都是不必要的;除了连字符之外,没有任何反斜杠字符在字符类中是特殊的。

但是,由于您的范围为A-z大写 A小写 z,您不仅可以在那里有两次小写字母,但你也有Za之间的所有字符,即[\],{ {1}},^_。这就是括号进入否定字符类的方式。

如果这不是你想要的,这个正则表达式可能就是你想要的:

`

(将连字符移到末尾意味着它不需要被反斜杠)