否定正则表达式以进行字符串替换

时间:2011-10-24 14:05:15

标签: java regex regex-negation

我有以下代码可以替换Java中的字符串中的电子邮件地址:

addressStr.replaceFirst("([a-zA-Z0-9_\\-\\.]+)@((\\[[0-9]{1,3}\\.[0-9]{1,3}\\.[0-9]{1,3}\\.)|(([a-zA-Z0-9\\-]+\\.)+))([a-zA-Z]{2,4}|[0-9]{1,3})", "")

因此,John Smith <john@smith.com>的字符串将变为John Smith <>。如何否定它以便它将替换所有与电子邮件地址不匹配的内容,并将最终结果仅作为john@smith.com

我尝试在前面放置^?<=,但它不起作用。

4 个答案:

答案 0 :(得分:6)

嗯,这不是你需要更改的正则表达式,而是调用代码。你的正则表达式匹配电子邮件地址(以一种奇怪的方式),replace()将其从字符串中删除。

所以只需使用

Pattern regex = Pattern.compile("([a-zA-Z0-9_\\-\\.]+)@((\\[[0-9]{1,3}\\.[0-9]{1,3}\\.[0-9]{1,3}\\.)|(([a-zA-Z0-9\\-]+\\.)+))([a-zA-Z]{2,4}|[0-9]{1,3})");
Matcher regexMatcher = regex.matcher(addressStr);
if (regexMatcher.find()) {
    address = regexMatcher.group();
}

答案 1 :(得分:3)

用于捕获电子邮件的完整Java正则表达式如下:

"(?:[a-z0-9!#$%&'*+/=?^_`{|}~-]+(?:\\.[a-z0-9!#$%&'*+/=?^_`{|}~-]+)*|\"(?:[\\x01-\\x08\\x0b\\x0c\\x0e-\\x1f\\x21\\x23-\\x5b\\x5d-\\x7f]|\\\\[\\x01-\\x09\\x0b\\x0c\\x0e-\\x7f])*\")@(?:(?:[a-z0-9](?:[a-z0-9-]*[a-z0-9])?\\.)+[a-z0-9](?:[a-z0-9-]*[a-z0-9])?|\\[(?:(?:25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)\\.){3}(?:25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?|[a-z0-9-]*[a-z0-9]:(?:[\\x01-\\x08\\x0b\\x0c\\x0e-\\x1f\\x21-\\x5a\\x53-\\x7f]|\\\\[\\x01-\\x09\\x0b\\x0c\\x0e-\\x7f])+)\\])"

请查看http://tools.ietf.org/html/rfc2822#section-3.4.1了解更多相关信息。

有点复杂,但它适用于所有已知和有效的电子邮件格式(您的邮件不允许使用bob+bib@gmail.com等有效的邮件)。

对于您的问题,如多次所述,只需找到(窃取Tim Pietzcker的一段代码):

Pattern regex = Pattern.compile("(?:[a-z0-9!#$%&'*+/=?^_`{|}~-]+(?:\\.[a-z0-9!#$%&'*+/=?^_`{|}~-]+)*|\"(?:[\\x01-\\x08\\x0b\\x0c\\x0e-\\x1f\\x21\\x23-\\x5b\\x5d-\\x7f]|\\\\[\\x01-\\x09\\x0b\\x0c\\x0e-\\x7f])*\")@(?:(?:[a-z0-9](?:[a-z0-9-]*[a-z0-9])?\\.)+[a-z0-9](?:[a-z0-9-]*[a-z0-9])?|\\[(?:(?:25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)\\.){3}(?:25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?|[a-z0-9-]*[a-z0-9]:(?:[\\x01-\\x08\\x0b\\x0c\\x0e-\\x1f\\x21-\\x5a\\x53-\\x7f]|\\\\[\\x01-\\x09\\x0b\\x0c\\x0e-\\x7f])+)\\])");
Matcher regexMatcher = regex.matcher(addressStr);
foundMatch = regexMatcher.find();

答案 2 :(得分:0)

您可以尝试:

String mailId = Pattern.compile(regexp, Pattern.LITERAL).matcher(addressStr).group();

这里的想法是获取匹配的字符串,而不是尝试用空白替换其他所有字符串。如果此操作重复,您可以将模式提取到字段中。

答案 3 :(得分:0)

只是不要替换....改为使用匹配。