正则表达式模式匹配替换第一次不替换

时间:2018-10-19 17:15:23

标签: regex

需要帮助。不知何故无法使它正常工作。需要替换电子邮件地址值。参见assert

String line = "John,Smith,123 Main St,Lake City,AB,37221,john.smith@gmail.com,";
Pattern ptn = Pattern.compile("(^[A-Za-z0-9.'_%+-]+@[A-Za-z0-9.-]+\.[A-Za-z]{2,}$)",Pattern.CASE_INSENSITIVE);
Matcher mtch = ptn.matcher(line);
String newLine =  mtch.replaceFirst("abc@gmail.com");
assertEquals("John,Smith,123 Main St,Lake City,AB,37221,abc@gmail.com,", newLine);

2 个答案:

答案 0 :(得分:0)

您需要使用两次转义符并删除锚点来对其进行修复:

s.replaceFirst("[A-Za-z0-9.'_%+-]+@[A-Za-z0-9.-]+\\.[A-Za-z]{2,}", "abc@gmail.com")
                ^                                ^^             ^

请参见regex demo

^匹配字符串的开头,$匹配字符串的结尾。他们阻止了您的正则表达式匹配。此外,要在Java字符串文字中定义反斜杠,必须使用2个反斜杠。

由于在Java正则表达式中,\w之类的速记类默认情况下不支持Unicode,因此您可以缩短模式:

s.replaceFirst("[\\w.'%+-]+@[A-Za-z0-9.-]+\\.[A-Za-z]{2,}", "abc@gmail.com")

如果要使用当前的应用逻辑:

String line = "John,Smith,123 Main St,Lake City,AB,37221,john.smith@gmail.com,";
Pattern ptn = Pattern.compile("[\\w.'%+-]+@[A-Za-z0-9.-]+\\.[A-Za-z]{2,}");
Matcher mtch = ptn.matcher(line);
String newLine =  mtch.replaceFirst("abc@gmail.com");
assertEquals("John,Smith,123 Main St,Lake City,AB,37221,abc@gmail.com,", newLine);

请参见Java demo online

答案 1 :(得分:0)

您希望匹配的电子邮件位于字符串的中间,但是正则表达式希望从头到尾匹配整个字符串。这是因为有'^'和'$'锚点。

以下是正则表达式的示例,但没有锚点: https://regex101.com/r/Roe6v6/1

编辑:请注意,regex101不支持所有正则表达式。用您的特定语言(Java?)实现模式时,请确保遵循正确的语法,如@WiktorStribiżew所说。