4

我有这个正则表达式:

[^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可变覆盖物[]也完全一无所知。

4

2 回答 2

7

你有A-z你的字符类,方括号字符按 ASCII(和 Unicode)顺序位于大写 Z 和小写 a 之间。因此]被认为是一个有效而不是无效的字符 - 大概你的意思是A-Z

于 2012-11-25T22:49:54.723 回答
4

这个正则表达式:

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

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

但是,由于您有从大写到小写的范围因此A-z不仅有两次小写字母,而且还有介于and之间的所有字符,即, , , ,和。这就是方括号进入否定字符类的方式。 A zZa[\]^_`

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

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

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

于 2012-11-25T22:50:19.153 回答