代码之家  ›  专栏  ›  技术社区  ›  alltej

Regex模式匹配replaceFirst不替换

  •  1
  • alltej  · 技术社区  · 6 年前

    我需要帮助。不知怎么的,我没办法让它工作。需要替换电子邮件地址值。看到了吗 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 回复  |  直到 6 年前
        1
  •  0
  •   Wiktor Stribiżew    6 年前

    您需要通过使用双转义和移除锚来修复它:

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

    看到了吗 regex demo

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

    \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 .

        2
  •  0
  •   Tyler Zeller    6 年前

    下面是一个正则表达式示例,但没有锚定: https://regex101.com/r/Roe6v6/1