java - 如何从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));
我使用上面的模式来获取遇到的令牌(效果很好),但是由于换行符,我很难获得预期的令牌。
解决方案
您需要稍微修改您的正则表达式模式,并(?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
推荐阅读
- java - 无法在硒测试中调用自定义注释
- c - 使用 MPI (C) 发送和接收 3D 矩阵
- arrays - 在 Groovy 中动态创建二维数组
- reactjs - React:从先前的状态构建动态表单并在其上处理错误。状态错误
- c# - 'system.stackoverflowexception' 类型的异常在 c# 中被 OpenGL 抛出
- c# - 为什么物体向下移动而不是向上移动?
- python-3.x - ldap3 查询组用户不返回用户数据
- c# - C# 获取文件类型的默认应用程序
- javascript - Native Base 如何获取 List dataArray 的 ListItem 索引?
- python-3.x - 如何在python 3.6.5中通过变量创建子元素