下面的表达式:
^(#ifdef FEATURE)+?\s*$((\r\n.*?)*^(#endif)+\s*[\/\/]*\s*(end of)*\s*FEATURE)+?$
运行编译的.Jar文件时,覆盖匹配的缓冲区。
匹配的字符串可以类似于:
这是一条垃圾线
#ifdef FEATURE
#endif // FEATURE的结尾这是一条垃圾线
#ifdef功能
这是一条应该匹配的垃圾线:HOLasduiqwhei&//功能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<String> patterns=new ArrayList<String>();
patterns=readFile("Disabled_Features.txt");
for(int i = 0; i < patterns.size(); ++i)
{
Pattern todoPattern = Pattern.compile("^#ifdef "+patterns.get(i)+"((?:\\r?\\n(?!#endif (?:// end of )?"+patterns.get(i)+"$).*)*)\\r?\\n#endif (?:// end of )?"+patterns.get(i)+"$",Pattern.MULTILINE);
Matcher m = todoPattern.matcher(text);
text = m.replaceAll("");
}
return text;
}
我尝试了@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
,从而可以包装大文本文件。为什么?因为Matcher
从a 构建a
Pattern
需要一个CharSequence
参数。
https://github.com/fge/largetext
问题内容: 我正在尝试输入之间的内容,我的模式没有做正确的事,请帮忙。 下面是sudocode: 要求的输出: 之一 二 三 问题答案: 先行使用并在循环中使用,而不是: 看到它在线上工作:ideone 但是最好在这里使用split: 看到它在线上工作:ideone
主要内容:正则表达式支持字符正则表达式(Regular Expression)又称正规表示法、常规表示法,在代码中常简写为 regex、regexp 或 RE,它是计算机科学的一个概念。 正则表达式是一个强大的字符串处理工具,可以对字符串进行查找、提取、分割、替换等操作,是一种可以用于模式匹配和替换的规范。一个正则表达式就是由普通的字符(如字符 a~z)以及特殊字符(元字符)组成的文字模式,它用以描述在查找文字主体时待匹配的
我想知道是否有人可以检查这个正则表达式并重写它,而不会出现灾难性的回溯?我的父亲似乎很不高兴 根据Java代码,它正试图使用此表达式来帮助查找并用波浪字符替换负数符号。 谢谢。
我找不到堆栈溢出的来源,但似乎是外部的循环造成的。 提前道谢!
我正在将一些较旧的Boost regex代码转换为C++11的过程中,我在一个测试用例中偶然发现了一个问题。下面是一个使用std::regex导致堆栈溢出异常的场景,但使用boost::regex可以很好地工作。我没有更改正则表达式模式,并且已经验证了该模式是我想要的。似乎是这个特定的字符串输入片段导致了堆栈溢出。使用VS2012,x64调试生成: