这个问题有点复杂,谷歌搜索并没有真正帮助。我会尽量只介绍它的相关方面。
我有一个大致如下格式的大文档:
样本输入:
ABC is a word from one line of this document. It is followed by
some random line
PQR which happens to be another word.
This is just another line
I have to fix my regular expression.
Here GHI appears in the middle.
This may be yet another line.
VWX is a line
this is the last line
我正在尝试根据以下内容删除文本部分:
- 来自:
- 美国广播公司
- 国防军
- 全球健康指数
- 对任何一个(同时保留这个词):
- 二维码
- STU
- 大众汽车
组成“From”的单词可以出现在一行中的任何位置(查看 GHI)。但要删除整条线需要删除。(需要删除包含 GHI 的整行,如下面的示例输出所示)
样本输出:
PQR which happens to be another word.
This is just another line
I have to fix my regular expression.
VWX is a line
this is the last line
上面的示例实际上对我来说似乎很容易,直到我针对非常大的输入文件(49KB)运行它
我尝试过的:
我目前使用的正则表达式是(不区分大小写和多行修饰符):
^.*\b(abc|def|ghi)\b(.|\s)*?\b(pqr|stu|vwx)\b
问题
上面的正则表达式非常适用于小文本文件。但是在大文件上失败/崩溃引擎。我已经针对以下情况进行了尝试:
- V8 (Node.js):挂起
- 犀牛:挂起
- Python:挂起
- Java :(
StackoverflowError
堆栈跟踪发布在这个问题的末尾) - 离子猴子(火狐):工作!
实际输入:
- 我的原始输入:http: //ideone.com/W4sZmB
我的正则表达式(为了清楚起见,分成多行):
^.*\\b(patient demographics|electronically signed|md|rn|mspt|crnp|rt)\\b (.|\\s)*? \\b(history of present illness|hpi|chief complaint|cc|reason for consult|patientis|inpatient is|inpatientpatient|pt is|pts are|start end frequency user)\\b
问题:
- 我的正则表达式正确吗?是否可以进一步优化以避免这个问题?
- 如果是正确的,为什么其他引擎会无限挂起?下面是一段堆栈跟踪:
堆栈跟踪:
Exception in thread "main" java.lang.StackOverflowError
at java.util.regex.Pattern$GroupTail.match(Pattern.java:4218)
at java.util.regex.Pattern$BranchConn.match(Pattern.java:4078)
at java.util.regex.Pattern$CharProperty.match(Pattern.java:3345)
at java.util.regex.Pattern$Branch.match(Pattern.java:4114)
at java.util.regex.Pattern$GroupHead.match(Pattern.java:4168)
at java.util.regex.Pattern$LazyLoop.match(Pattern.java:4357)
at java.util.regex.Pattern$GroupTail.match(Pattern.java:4227)
at java.util.regex.Pattern$BranchConn.match(Pattern.java:4078)
PS:我在这个问题上添加了几个标签,因为我已经在这些环境中尝试过,但实验失败了。