【问题标题】:String matches across multiple lines in text using Regex in java [duplicate]使用Java中的Regex在文本中的多行匹配字符串[重复]
【发布时间】:2021-04-20 06:18:56
【问题描述】:

我有这个示例字符串

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

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

因此该模式应该返回 5149427501 作为匹配 ABC24938699 作为匹配 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");
}

但它不起作用。

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

【问题讨论】:

  • 您的模式有效,但我认为您必须使用 while (m.find()) { 并获取第 1 组和第 2 组的值。请参阅ideone.com/cBocRG

标签: java regex


【解决方案1】:

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

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

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

【讨论】:

  • 为什么需要 DOTALL?
【解决方案2】:

看来你的字符串行是json字符串。如果是这样,我认为最好的做法是使用jackson来解决你的问题。

你可以在这里看到我的代码 https://github.com/onemaomao/java-common-mistakes/blob/master/src/main/java/org/geekbang/time/questions/stackoverflow/reslove/q2/JacksonUsage.java

【讨论】:

  • 字符串行 = "{\"ABC\":\"5149427501\",\"DEF\":4168170001,\"GHI\":\"RC81020329801823\",\"JKL\" :\"24938699\",\"MNO\":\"941580078\"}"; ObjectMapper 映射器 = 新 ObjectMapper(); Map readValue = mapper.readValue(line, Map.class); System.out.println(readValue); System.out.println(readValue.get("ABC")); System.out.println(readValue.get("JKL"));
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-02-24
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-05-09
相关资源
最近更新 更多