Java正则表达式和组
我需要解析日志文件并获取一些变量值。 日志文件将包含一个字符串
String logStr = "21:19:03 -[ 8b4]- ERROR - Jhy AlarmOccure::OnAdd - Updated existing alarm: ID [StrValue1:StrValu2|StrValue3], Instance [4053], SetStatus [0], AckStatus [1], SetTime [DateValue4], ClearedTime [DateValue5]";
我需要将StrValue1、StrValue2、StrValue3、DateValue4和DateValue5设置为变量。一旦出现错误,这些值的字段就会发生变化
首先,我想至少得到StrValue1。但是没有得到预期的结果
Pattern twsPattern = Pattern.compile(".*?ID ?[([^]:]*):([^]|]*)|([^]]*)]");//.*ID\\s$.([^]:]*.):.([^]|]*.)|.([^]]*.).]
Matcher twsMatcher = twsPattern.matcher(logStr);
if(twsMatcher.find()){
System.out.println(twsMatcher.start());
System.out.println(twsMatcher.group());
System.out.println(twsMatcher.end());
}
我无法理解regex中的分组内容
# 1 楼答案
试试regexp
([a-zA-z]+) \[([^\]]+)\]
对于字符串
21:19:03 -[ 8b4]- ERROR - Jhy AlarmOccure::OnAdd - Updated existing alarm: ID [StrValue1:StrValu2|StrValue3], Instance [4053], SetStatus [0], AckStatus [1], SetTime [DateValue4], ClearedTime [DateValue5]
,它返回:ID
和StrValue1:StrValu2|StrValue3
Instance
和4053
SetStatus
和0
AckStatus
和1
SetTime
和DateValue4
ClearedTime
和DateValue5
你可以测试它
# 2 楼答案
长话短说,您的正则表达式缺少一些转义字符,比如
[
和|
(这一个,如果在字符类之外-[]
)因此,当您想要实际匹配
[
字符时,必须在java字符串中使用\[
(或\\[
)。而且,组([^]:]*)
中的否定不是它看起来的那样。您可能只需要([^:]*)
,它匹配所有内容,直到:
那么,为了使其工作,只需使用^{} 来检索值。这是最终正则表达式的调整代码:
# 3 楼答案
很高兴你这么做!你实际上做得很好。你需要避开方括号,而不是字符类,即
希望你能意识到
([^]:]*)
的意思是,“不带(结束方括号或冒号的最长字符串。”您可能还想转义
|
,因为这是正则表达式中的一个交替运算符,即# 4 楼答案
我喜欢更一般的解决方案,但这里有一个非常具体的模式,如果适合你,你可以使用它。它将捕获字符串中的所有值,只要它们遵循相同的、非常特定的模式
结果如下:
Try it out
每行有多个匹配项
这个版本将只匹配ID、SetTime或ClearedTime字符串中的每个实例,后跟一个括号内的值
结果
Try it out