正则表达式永远不匹配

时间:2011-10-09 00:30:28

标签: java regex

我的日志文件中有以下条目:

09-22-11 12:35:09 1ms   INFO         ...erChangeSetListener:91           11  processing changeSet for class:4328,at version:1316720109100
09-22-11 12:35:09 779ms INFO         ...erChangeSetListener:91           11  processing changeSet for class:4334,at version:1316720109882
09-22-11 12:35:09 1ms   INFO         ...erChangeSetListener:91           11  processing changeSet for class:4328,at version:1316720109882
09-22-11 12:35:11 1s    WARNING      QueryServiceImpl:100                -   no existing index for class:4328
09-22-11 12:35:11       SEVERE       QueryRequest:107                    7   Aod query resulted in error:No index available for class:4328
09-22-11 12:35:11       SEVERE       AuthenticationTask:48               -   EndUserException: an error occurred when processing the query                                  Dump: /data1/amir/dev/devots/logs/dumps/22i123511.dump

我正在将此正则表达式应用于:

 final String pattern = "^(\\d{2}-\\d{2}-\\d{2} \\d{2}:\\d{2}:\\d{2})"  //date
                        + "[.]*" //ignore for now
                        + "(SEVERE|WARNING|INFO|CONFIG|FINE|FINER|FINEST)" //severity
                        + "[.]*"; //ignore the rest for now

 final Pattern regex = Pattern.compile(pattern);
 final Matcher m = regex.matcher(currentLine);
 if (m.matches()) {
     for (int i = 1; i <= m.groupCount(); i++) {
         System.out.format("[%d] \"%s\"%n", i, m.group(i));
     }
 }

但我的比赛永远不会回归真实。我不明白为什么。我想灵活地处理这些不同类型的条目。请注意,最后一个日志条目具有与之关联的转储文件。

2 个答案:

答案 0 :(得分:5)

问题在于:

                    + "[.]*" //ignore for now

"[.]*"中的点只与文字点匹配,它没有“任何非行分隔符”的通常含义。您需要".*"

答案 1 :(得分:2)

你不能[.]*.*就足够了。你想要任何角色,而不是一个点。

在此处测试您的正则表达式:http://regexpal.com/

从一个非常简单的匹配开始,一点一点地开始增加复杂性。

另外,为清楚起见,请考虑将您的群组命名为:

^(?<date>\d{2}-\d{2}-\d{2} \d{2}:\d{2}:\d{2}).*(?<type>SEVERE|WARNING|INFO|CONFIG|FINE|FINER|FINEST).*