使用java中的正则表达式跨文本中的多行进行字符串匹配
我有这个示例字符串
ABC : 5149427501\nDEF : 4168170001\nGHI : RC81020329801823\nJKL : 24938699\nMNO : 941580078
我想使用正则表达式提取与字符串ABC
和JKL
对应的值
因此,模式应该返回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");
}
但它不起作用
我是正则表达式的初学者。你能建议如何在字符串中找到图案吗
# 1 楼答案
你很接近。您需要标记DOTALL,而不是标记MULTILINE。您还需要删除行元字符的开头,即
^
,并且需要使用while
而不是if
来继续搜索模式的下一次出现。最后,你的正则表达式只包含两个组将您的代码与以下代码进行比较
上述代码产生的输出为:
# 2 楼答案
你的字符串行似乎是json字符串。如果是这样,我认为最好的做法是使用jackson来解决你的问题
你可以在这里看到我的代码 https://github.com/onemaomao/java-common-mistakes/blob/master/src/main/java/org/geekbang/time/questions/stackoverflow/reslove/q2/JacksonUsage.java