有 Java 编程相关的问题?

你可以在下面搜索框中键入要查询的问题!

使用java中的正则表达式跨文本中的多行进行字符串匹配

我有这个示例字符串

ABC : 5149427501\nDEF : 4168170001\nGHI : RC81020329801823\nJKL : 24938699\nMNO : 941580078

我想使用正则表达式提取与字符串ABCJKL对应的值

因此,模式应该返回5149427501作为ABC的匹配,返回24938699作为JKL的匹配

我一直在尝试制定正则表达式和代码,但它不起作用

String line = "ABC : 5149427501\nDEF : 4168170001\nGHI : RC81020329801823\nJKL : 24938699\nMNO : 941580078";
String pattern = "^\\s*(ABC|JKL)\\s*:\\s*(\\d+)\\s*";

// Create a Pattern object
Pattern r = Pattern.compile(pattern, Pattern.MULTILINE);

// Now create matcher object.
Matcher m = r.matcher(line);
if (m.find()) {
    System.out.println("Found value: " + m.group(0) );
    System.out.println("Found value: " + m.group(1) );
    System.out.println("Found value: " + m.group(2) );
    System.out.println("Found value: " + m.group(3) );
    System.out.println("Found value: " + m.group(4) );

} else {
    System.out.println("NO MATCH");
}

但它不起作用

我是正则表达式的初学者。你能建议如何在字符串中找到图案吗


共 (2) 个答案

  1. # 1 楼答案

    你很接近。您需要标记DOTALL,而不是标记MULTILINE。您还需要删除元字符的开头,即^,并且需要使用while而不是if来继续搜索模式的下一次出现。最后,你的正则表达式只包含两个组

    将您的代码与以下代码进行比较

    String line = "ABC : 5149427501\nDEF : 4168170001\nGHI : RC81020329801823\nJKL : 24938699\nMNO : 941580078";
    String pattern = "\\s*(ABC|JKL)\\s*:\\s*(\\d+)\\s*";
    
    // Create a Pattern object
    Pattern r = Pattern.compile(pattern, Pattern.DOTALL);
    
    // Now create matcher object.
    Matcher m = r.matcher(line);
    boolean found = false;
    while (m.find()) {
        found = true;
        System.out.println("Found value: " + m.group(1));
        System.out.println("Found value: " + m.group(2));
    }
    if (!found) {
        System.out.println("NO MATCH");
    }
    

    上述代码产生的输出为:

    Found value: ABC
    Found value: 5149427501
    Found value: JKL
    Found value: 24938699