如何从Java中的字符串中提取某些子字符串?

时间:2021-04-24 05:58:41

标签: java regex

我正在尝试从如下所示的解析异常消息中提取一些信息:

"Encountered " <FUNCNAME> "FF "" at line 1, column 22.
Was expecting:
    "DEF" ..."

从这条消息中,我想获得遇到的令牌,在上面的例子中,它是“FUNCNAME”,我也想得到预期的令牌,同样,在这种情况下,它是“DEF”。

String[] REGEX = { "Encountered \" <(.*)> ", "Encountered (.*)." };
Pattern pattern = Pattern.compile(REGEX[0]);
Matcher matcher = pattern.matcher(message);
System.out.println("Matched:  " + matcher.group(1));

我使用上面的模式来获取遇到的令牌(工作正常),但由于换行符,我正在努力获得预期的令牌。

1 个答案:

答案 0 :(得分:0)

您需要稍微修改您的正则表达式模式,并在声明正则表达式时使用点全 (?s) 修饰符,以便 .* 可以跨行匹配。

String message = "\"Encountered \" <FUNCNAME> \"FF \" at line 1, column 22.\nWas expecting:\n\"DEF\" ...";
String regex = "(?s)\"Encountered \" <(.*?)>.*?Was expecting:\\s+\"(.*?)\"";
Pattern p = Pattern.compile(regex);
Matcher m = p.matcher(message);
if (m.find()) {
    System.out.println("Matched: " + m.group(1) + ", " + m.group(2));
}

打印:

Matched: FUNCNAME, DEF