正则表达式匹配循环永远不会终止

时间:2015-10-07 12:45:08

标签: java regex

我有一个ASCII文本文件我试图使用正则表达式来解析Java。文件示例:

09-JUN-15 22:33     Eq:1    P1010030    1   HPCT: 0.0   RlTqCur:532 RlTqMin:-266    RlTqMax:270 ESMIN:2 ESMAX:2

我构建了我的表达式,但我想我可能会遇到一个可能失控的正则表达式案例。我的while (m.find())循环永远不会终止。

我的正则表达式很长。以下是问题区域:"(esmin:)(?<esmin>\\d+)"

当我从表达式中删除(esmin:)时,while循环按预期终止。我打破了正则表达式规则吗?我不知道为什么我有困难。

谢谢。

编辑:修复了丢失的&#34;)&#34;对不起,这不是问题所在。是的,我在模式中使用不区分大小写的标志。这是一些代码:

    Pattern p = Pattern.compile(regexData.getJobDataType1(),Pattern.CASE_INSENSITIVE | Pattern.DOTALL);
    Matcher m = p.matcher(fileData);


    while (m.find()) {


    }

EDIT2:下面stribizhev指出的问题是,fileData中读取的字符串实际上是整个ASCII文件。

1 个答案:

答案 0 :(得分:1)

由于您的预期值位于一行上,因此您可以更加安全地逐行读取整个输入。

使用BufferedReader

举个例子:

BufferedReader reader = ...; // initialize the reader
String line = null;
Pattern p = Pattern.compile(regexData.getJobDataType1(),Pattern.CASE_INSENSITIVE);    
while ((line = reader.readLine()) != null)
{
     Matcher m = p.matcher(line);
     while (m.find()) {
            // Process the match
     }
}

请注意,Pattern.DOTALL修饰符仅更改模式内点的行为,而不匹配输入字符串中的点。由于您的模式为(esmin:)(?<esmin>\\d+),即它内部没有句点,因此修饰符是多余的。如果您需要匹配浮点值(不只是整数值),请使用[+-]?\\d*\\.?\\d+代替\\d+