首页 > 解决方案 > 如何从Java中的字符串中提取某些子字符串?

问题描述

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

"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));

我使用上面的模式来获取遇到的令牌(效果很好),但是由于换行符,我很难获得预期的令牌。

标签: javaregex

解决方案


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

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

推荐阅读