java - 我的正则表达式导致 Java 中的堆栈溢出;我错过了什么?

标签 java regex string stack-overflow

我正在尝试将正则表达式与 Scanner 结合使用来匹配文件中的字符串。正则表达式适用于文件的所有内容,除了这一行:

DNA="ITTTAITATIATYAAAYIYI[....]ITYTYITTIYAIAIYIT"

在实际文件中,省略号代表几千个字符。

当读取文件的循环到达包含碱基的行时,发生堆栈溢出错误。

这是循环:

while (scanFile.hasNextLine()) {
   final String currentLine = scanFile.findInLine(".*");
   System.out.println("trying to match '" + currentLine + "'");
   Scanner internalScanner = new Scanner(currentLine);
   String matchResult = internalScanner.findInLine(Constants.ANIMAL_INFO_REGEX);
   assert matchResult != null : "there's no reason not to find a match"; 
   matches.put(internalScanner.match().group(1), internalScanner.match().group(2));
   scanFile.nextLine();
  }

和正则表达式:

static final String ANIMAL_INFO_REGEX = "([a-zA-Z]+) *= *\"(([a-zA-Z_.]| |\\.)+)";

这是失败痕迹:

java.lang.StackOverflowError
    at java.util.regex.Pattern$CharProperty.match(Pattern.java:3360)
    at java.util.regex.Pattern$Branch.match(Pattern.java:4131)
    at java.util.regex.Pattern$GroupHead.match(Pattern.java:4185)
    at java.util.regex.Pattern$Loop.match(Pattern.java:4312)
    at java.util.regex.Pattern$GroupTail.match(Pattern.java:4244)
    at java.util.regex.Pattern$BranchConn.match(Pattern.java:4095)
    at java.util.regex.Pattern$CharProperty.match(Pattern.java:3362)
    at java.util.regex.Pattern$Branch.match(Pattern.java:4131)
    at java.util.regex.Pattern$GroupHead.match(Pattern.java:4185)
    at java.util.regex.Pattern$Loop.match(Pattern.java:4312)
    at java.util.regex.Pattern$GroupTail.match(Pattern.java:4244)
    at java.util.regex.Pattern$BranchConn.match(Pattern.java:4095)
    at java.util.regex.Pattern$CharProperty.match(Pattern.java:3362)
    at java.util.regex.Pattern$Branch.match(Pattern.java:4131)
    at java.util.regex.Pattern$GroupHead.match(Pattern.java:4185)
    at java.util.regex.Pattern$Loop.match(Pattern.java:4312)
    at java.util.regex.Pattern$GroupTail.match(Pattern.java:4244)
    at java.util.regex.Pattern$BranchConn.match(Pattern.java:4095)
    ...etc (it's all regex).

非常感谢!

最佳答案

这看起来像 bug 5050507 .我同意 Asaph 的观点,删除交替应该有所帮助;该错误特别指出“尽可能避免交替”。我认为您可以更简单:

"^([a-zA-Z]+) *= *\"([^\"]+)"

关于java - 我的正则表达式导致 Java 中的堆栈溢出;我错过了什么?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3681928/

相关文章:

python - 如何使用 Python NLTK 识别单个字符之间的搭配?

java - 数java中的二进制数?

java - gdb 在 Alpine Linux 上调试 OpenJDK java 失败,错误代码为 "Thread recieved signal ?, Unknown signal"

java - 以编程方式突出显示 smartgwt 表单中的文本

php - laravel 正则表达式验证不起作用

java - RegExp - 替换精确的字符串

ruby-on-rails - 如何在 Ruby 中对字符串进行 URL 编码

java - 请让我知道任何适用于 jdk 1.7 的 MySQL 版本

javascript - 正则表达式匹配域名

javascript - 如何使用 javascript 替换这些笑脸