Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/332.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
在Java中,正则表达式一直回溯到溢出_Java_Regex_Pattern Matching_Backtracking - Fatal编程技术网

在Java中,正则表达式一直回溯到溢出

在Java中,正则表达式一直回溯到溢出,java,regex,pattern-matching,backtracking,Java,Regex,Pattern Matching,Backtracking,下面的表达: ^(#ifdef FEATURE)+?\s*$((\r\n.*?)*^(#endif)+\s*[\/\/]*\s*(end of)*\s*FEATURE)+?$ 在运行编译的.Jar文件时重写匹配的缓冲区 匹配字符串可以类似于: 这是一条垃圾线 #ifdef功能 #endif//功能结束 这是一条垃圾线 #ifdef功能 这是一个应该匹配的垃圾行:HOLasduiqwhei&//FEATURE fjfefj #endif//h #endif功能 这是一条垃圾线 因此,粗体字符串应

下面的表达:

^(#ifdef FEATURE)+?\s*$((\r\n.*?)*^(#endif)+\s*[\/\/]*\s*(end of)*\s*FEATURE)+?$
在运行编译的.Jar文件时重写匹配的缓冲区

匹配字符串可以类似于:

这是一条垃圾线

#ifdef功能
#endif//功能结束

这是一条垃圾线

#ifdef功能

这是一个应该匹配的垃圾行:HOLasduiqwhei&//FEATURE fjfefj #endif//h

#endif功能

这是一条垃圾线

因此,粗体字符串应该匹配。错误如下:

   at java.util.regex.Pattern$GroupHead.match(Unknown Source)
   at java.util.regex.Pattern$Loop.match(Unknown Source)
   at java.util.regex.Pattern$GroupTail.match(Unknown Source)
   at java.util.regex.Pattern$Curly.match1(Unknown Source)
   at java.util.regex.Pattern$Curly.match(Unknown Source)
   at java.util.regex.Pattern$Slice.match(Unknown Source)
   at java.util.regex.Pattern$GroupHead.match(Unknown Source)
   at java.util.regex.Pattern$Loop.match(Unknown Source)
   at java.util.regex.Pattern$GroupTail.match(Unknown Source)
   at java.util.regex.Pattern$Curly.match1(Unknown Source)
   at java.util.regex.Pattern$Curly.match(Unknown Source)
   at java.util.regex.Pattern$Slice.match(Unknown Source)
   at java.util.regex.Pattern$GroupHead.match(Unknown Source)
   at java.util.regex.Pattern$Loop.match(Unknown Source)
   at java.util.regex.Pattern$GroupTail.match(Unknown Source)
   at java.util.regex.Pattern$Curly.match1(Unknown Source)
   at java.util.regex.Pattern$Curly.match(Unknown Source)
   at java.util.regex.Pattern$Slice.match(Unknown Source)
   at java.util.regex.Pattern$GroupHead.match(Unknown Source)
   at java.util.regex.Pattern$Loop.match(Unknown Source)
   at java.util.regex.Pattern$GroupTail.match(Unknown Source)
   at java.util.regex.Pattern$Curly.match1(Unknown Source)
   at java.util.regex.Pattern$Curly.match(Unknown Source)
   at java.util.regex.Pattern$Slice.match(Unknown Source)
   at java.util.regex.Pattern$GroupHead.match(Unknown Source)
   at java.util.regex.Pattern$Loop.match(Unknown Source)
   at java.util.regex.Pattern$GroupTail.match(Unknown Source)
   at java.util.regex.Pattern$Curly.match1(Unknown Source)
   at java.util.regex.Pattern$Curly.match(Unknown Source)
   at java.util.regex.Pattern$Slice.match(Unknown Source)
欢迎采用任何回溯避免策略/改进表达式。我尝试过原子群
(?>)
,但由于某些原因,没有简化

代码如下:

公共字符串条(字符串文本){

ArrayList patterns=new ArrayList();
patterns=readFile(“Disabled_Features.txt”);
对于(int i=0;i
我试过@Wiktor编写的代码,效果很好

import java.util.regex.Matcher;
import java.util.regex.Pattern;

public class TestRegex {
  public static void main(String[] args) {
    String text = "this is a junk line\n" + 
        "\n" + 
        "#ifdef FEATURE \n" + 
        "#endif // end of FEATURE\n" + 
        "\n" + 
        "this is a junk line\n" + 
        "\n" + 
        "#ifdef FEATURE\n" + 
        "\n" + 
        "this is a junk line that should be matched: HOLasduiqwhei & // FEATURE fjfefj #endif // h\n" + 
        "\n" + 
        "#endif FEATURE\n" + 
        "\n" + 
        "this is a junk line";

    // this version does not use Pattern.MULTILINE, this should reduce the backtraking
    Matcher matcher2 = Pattern.compile("\\n#ifdef FEATURE((?:\\r?\\n(?!#endif (?:// end of )?FEATURE).*)*)\\r?\\n#endif (?:// end of )?FEATURE").matcher(text);
    while (matcher2.find()) {
      System.out.println(matcher2.group());
    }

  }
}
这让我认为您的问题是由于输入文件的大小

因此,如果文件太大,可以将输入实现为
CharSequence
,这样就可以包装大文本文件。为什么?因为从
模式构建
匹配器
需要
字符序列
作为参数


我试过@Wiktor编写的代码,效果很好

import java.util.regex.Matcher;
import java.util.regex.Pattern;

public class TestRegex {
  public static void main(String[] args) {
    String text = "this is a junk line\n" + 
        "\n" + 
        "#ifdef FEATURE \n" + 
        "#endif // end of FEATURE\n" + 
        "\n" + 
        "this is a junk line\n" + 
        "\n" + 
        "#ifdef FEATURE\n" + 
        "\n" + 
        "this is a junk line that should be matched: HOLasduiqwhei & // FEATURE fjfefj #endif // h\n" + 
        "\n" + 
        "#endif FEATURE\n" + 
        "\n" + 
        "this is a junk line";

    // this version does not use Pattern.MULTILINE, this should reduce the backtraking
    Matcher matcher2 = Pattern.compile("\\n#ifdef FEATURE((?:\\r?\\n(?!#endif (?:// end of )?FEATURE).*)*)\\r?\\n#endif (?:// end of )?FEATURE").matcher(text);
    while (matcher2.find()) {
      System.out.println(matcher2.group());
    }

  }
}
这让我认为您的问题是由于输入文件的大小

因此,如果文件太大,可以将输入实现为
CharSequence
,这样就可以包装大文本文件。为什么?因为从
模式构建
匹配器
需要
字符序列
作为参数

更新:

我尝试实施Wiktor的解决方案:

"^#ifdef "+patterns.get(i)+"((?:\\r?\\n(?!#endif (?:// end of )?"+patterns.get(i)+"$).*)*)\\r?\\n#endif (?:// end of )?"+patterns.get(i)+"$"
它只捕获第二个块,但不捕获以下块:

#ifdef功能

垃圾捕获文本

#endif//功能结束

无论如何,当我运行jar时,仍然会溢出。

更新:

我尝试实施Wiktor的解决方案:

"^#ifdef "+patterns.get(i)+"((?:\\r?\\n(?!#endif (?:// end of )?"+patterns.get(i)+"$).*)*)\\r?\\n#endif (?:// end of )?"+patterns.get(i)+"$"
它只捕获第二个块,但不捕获以下块:

#ifdef功能

垃圾捕获文本

#endif//功能结束



无论如何,当我运行jar时仍然会溢出。

检查。您好,您的表达式仍然会给我溢出。请发布用于匹配regex的代码。对不起,功能块如下:再次检查post。erg。。。我指的是java代码。我已经更新了我的答案,并尝试了@WiktorStribiżew编写的代码。没有溢出。检查。您好,您的表达式仍然给我一个溢出。请发布用于匹配正则表达式的代码。对不起,功能块如下:再次检查post。erg。。。我指的是java代码。我已经更新了我的答案,并尝试了@WiktorStribiżew编写的代码。没有溢出。就我所见,我的表达式没有明显的开括号。就在最后一个“功能”之后。我在快速浏览器编译器中尝试了您的表达式,但不起作用。最后一个“功能”名称应该是必需的。您好,这个regexp确实应该与块匹配,但是当我在java文件中使用它时,它只是溢出,并且目标文件没有明显的更改。可能异常是由您正在解析的文件的大小引起的。有什么解决方案吗?您可以发布它以便我可以尝试,拜托?据我所知,我的表达式没有明显的开括号。就在最后一个“功能”之后。我在快速浏览器编译器中尝试了您的表达式,但不起作用。最后一个“功能”名称应该是必需的。您好,这个regexp确实应该与块匹配,但是当我在java文件中使用它时,它只是溢出,并且目标文件没有明显的更改。可能异常是由您正在解析的文件的大小引起的。有什么解决方案吗?您可以发布它以便我可以尝试吗?