1

我需要解析日志文件并获取一些变量值。日志文件将有一个字符串

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());
}

我无法理解正则表达式中的分组内容。

4

4 回答 4

2

长话短说,你的正则表达式缺乏转义一些字符,比如[|(这个,如果在字符类之外 - [])。

所以当你想真正匹配[char时,你必须使用\[(或\\[在java字符串中)。此外,该组中的否定([^]:]*)并不是看起来的那样。您可能想要 just ([^:]*),它匹配直到 a 的所有内容:

那么,要使其工作,您只需使用Matcher#group(int)来检索值。这是带有最终正则表达式的改编代码:

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]";
Pattern twsPattern = Pattern.compile(".*?ID ?\\[([^:]*):([^|]*)\\|([^\\]]*)\\].*?SetTime ?\\[([^\\]]*)\\][^\\[]+\\[([^\\]]*)\\]");
Matcher twsMatcher = twsPattern.matcher(logStr);
if (twsMatcher.find()){
    System.out.println(twsMatcher.group(1)); // StrValue1
    System.out.println(twsMatcher.group(2)); // StrValu2
    System.out.println(twsMatcher.group(3)); // StrValue3
    System.out.println(twsMatcher.group(4)); // DateValue4
    System.out.println(twsMatcher.group(5)); // DateValue5
}
于 2013-07-18T23:36:30.980 回答
2

尝试正则表达式([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],它返回:

  • IDStrValue1:StrValu2|StrValue3
  • Instance4053
  • SetStatus0
  • AckStatus1
  • SetTimeDateValue4
  • ClearedTimeDateValue5

你可以在这里测试它。

于 2013-07-18T23:31:19.607 回答
2

很高兴你的尝试!你实际上做得很好。您需要转义不意味着字符类的方括号,

.*?ID ?\[
       ^

并且希望您知道您的意思是“没有右方括号或冒号([^]:]*)的最长可能字符串”。

您可能还想转义|, 因为这是正则表达式中的交替运算符,

\|
于 2013-07-18T23:31:36.240 回答
0

我喜欢更通用的解决方案,但这里有一个非常具体的模式,如果它适合你,你可以使用它。只要它们遵循相同的、非常具体的模式,它将捕获字符串中的所有值。

ID (?:\[([^\]:]+):([^\]|]+)\|([^\]]+)\]).*?SetTime \[([^\]]+)\], ClearedTime \[([^\]]+)\]

结果如下:

1: ID [StrValue1:StrValu2|StrValue3], Instance [4053], SetStatus [0], AckStatus [1], SetTime [DateValue4], ClearedTime [DateValue5]
  [1]: StrValue1
  [2]: StrValu2
  [3]: StrValue3
  [4]: DateValue4
  [5]: DateValue5

试试看

每行多个匹配

此版本将仅匹配 ID、SetTime 或 ClearedTime 字符串中的每个实例,后跟括号中的值。

(ID|SetTime|ClearedTime) \[([^\]]+)\

结果

1: ID [StrValue1:StrValu2|StrValue3]
  [1]: ID
  [2]: StrValue1:StrValu2|StrValue3
1: SetTime [DateValue4]
  [1]: SetTime
  [2]: DateValue4
1: ClearedTime [DateValue5]
  [1]: ClearedTime
  [2]: DateValue5

试试看

于 2013-07-18T23:41:20.900 回答