导致 StackoverFlow 的正则表达式模式
Regex Patterns causing StackoverFlow
我正在 JAVA8 中进行一个项目,我想从目录或 link 中获取 HTML 文件,并删除所有样式和脚本文件中的标签和 return 剩下的内容。这是在大量文件上迭代执行的。
现在这些是我用来删除指定标签的两种不同的正则表达式模式。
//remove style tags and style tag content
update = update.replaceAll("<style\b[^<]*(?:(?!</style>)<[^<]*)*</style>", "");
//remove script tags and script tag content
update = update.replaceAll("<script[\s\S]*?>[\s\S]*?</script>", "");
这在一段时间内有效,但似乎偶尔会遇到 java.lang.WhosebugError
。
我认为当文件太大时会发生这种情况。我做了一些研究,发现如果您在模式中使用 "|"
就会发生这种情况,因为此运算符使用递归,这可能会占用大量内存,具体取决于遍历的级别数。
我已经设法在不同的测试文件上反复使用这些模式多达 1000 次。
我的问题是:有人看到这些模式会使用递归吗?或任何暗示模式本身是导致溢出的原因?
如果没有,也许我有办法将字符串减小到不会导致过载的大小。
使用 print 语句似乎在尝试匹配模式时可能会发生溢出:
"<script[\s\S]*?>[\s\S]*?</script>"
此外,有人告诉我可以改用这个:
"<script[\s\S]+?>[\s\S]+?</script>"
因为这并没有向前看那么远。此模式在 Regexr 中有效,但在 JAVA 应用程序中实施后未提供相同的输出。
这是我收到的堆栈跟踪:
Exception in thread "main" java.lang.WhosebugError
at java.util.regex.Pattern$Curly.match0(Pattern.java:4252)
at java.util.regex.Pattern$Curly.match(Pattern.java:4236)
at java.util.regex.Pattern$BmpCharProperty.match(Pattern.java:3800)
at java.util.regex.Pattern$Neg.match(Pattern.java:5099)
at java.util.regex.Pattern$GroupHead.match(Pattern.java:4660)
at java.util.regex.Pattern$Loop.match(Pattern.java:4787)
at java.util.regex.Pattern$GroupTail.match(Pattern.java:4719)
at java.util.regex.Pattern$Curly.match0(Pattern.java:4274)
我乐于接受任何建议。先谢谢你了。
我正在 JAVA8 中进行一个项目,我想从目录或 link 中获取 HTML 文件,并删除所有样式和脚本文件中的标签和 return 剩下的内容。这是在大量文件上迭代执行的。
现在这些是我用来删除指定标签的两种不同的正则表达式模式。
//remove style tags and style tag content
update = update.replaceAll("<style\b[^<]*(?:(?!</style>)<[^<]*)*</style>", "");
//remove script tags and script tag content
update = update.replaceAll("<script[\s\S]*?>[\s\S]*?</script>", "");
这在一段时间内有效,但似乎偶尔会遇到 java.lang.WhosebugError
。
我认为当文件太大时会发生这种情况。我做了一些研究,发现如果您在模式中使用 "|"
就会发生这种情况,因为此运算符使用递归,这可能会占用大量内存,具体取决于遍历的级别数。
我已经设法在不同的测试文件上反复使用这些模式多达 1000 次。
我的问题是:有人看到这些模式会使用递归吗?或任何暗示模式本身是导致溢出的原因?
如果没有,也许我有办法将字符串减小到不会导致过载的大小。
使用 print 语句似乎在尝试匹配模式时可能会发生溢出:
"<script[\s\S]*?>[\s\S]*?</script>"
此外,有人告诉我可以改用这个:
"<script[\s\S]+?>[\s\S]+?</script>"
因为这并没有向前看那么远。此模式在 Regexr 中有效,但在 JAVA 应用程序中实施后未提供相同的输出。
这是我收到的堆栈跟踪:
Exception in thread "main" java.lang.WhosebugError
at java.util.regex.Pattern$Curly.match0(Pattern.java:4252)
at java.util.regex.Pattern$Curly.match(Pattern.java:4236)
at java.util.regex.Pattern$BmpCharProperty.match(Pattern.java:3800)
at java.util.regex.Pattern$Neg.match(Pattern.java:5099)
at java.util.regex.Pattern$GroupHead.match(Pattern.java:4660)
at java.util.regex.Pattern$Loop.match(Pattern.java:4787)
at java.util.regex.Pattern$GroupTail.match(Pattern.java:4719)
at java.util.regex.Pattern$Curly.match0(Pattern.java:4274)
我乐于接受任何建议。先谢谢你了。