我试图通过查找“!”、“?”来确定英语句子的结尾(仅近似)。或“.”,但在“.”的情况下仅当前面没有常见的缩写,如 Mr. 或 Dr.
有什么方法可以使以下正则表达式的效率稍微提高一点?也许通过按降序甚至按字母顺序对负面回顾进行排序?
这是我现在拥有的正则表达式:
((?<!St|Sgt|Rev|Ltd|Inc|Lt|Jr|Sr|Esq|Inst|Hon|Gen|Cpl|Comdr|Col|Corp|Mr|Dr|Gov|Mrs|Ms|[A-Z]|Assn|Capt)(\.)|(!)|(\?))(\s*$|\s+([_$#]|[A-Z][^.]))
问题:
网站在 http://regex.powertoy.org/报告:“7 匹配 21044 探测(已完成)”即使是一个简单的段落......数字 21044 的惊人大小似乎与负面回顾的数量密切相关。
我正在寻求降低 RegEx 引擎的计算复杂性,因为我有几 GB 的数据要通过它。
有什么办法可以解决这个问题吗?负面回顾真的是实现这一目标的最佳/唯一方法吗?有没有办法将其作为前瞻来代替?正则表达式是执行此任务的错误工具吗?
编辑:我可以使用 ActionScript 或 PHP 的 RegEx 引擎。
编辑:我不能指望句子之间的空格数。真的!?叹。
如果您不了解与优化有关的 RegEx 引擎的内部工作原理,请不要回答。
提前致谢。
最佳答案
也许尝试只在成功匹配后进行负向后视测试。而不是每个字符:
(?x: # Allow spacing and comments
(
(\.) # First match "."
(?<! # Then negative-look-behind for titles followed by "."
(?: St|Sgt|Rev|Ltd|Inc|Lt|Jr|Sr|Esq|Inst|Hon|Gen|Cpl|Comdr|Col|Corp|Mr|Dr|Gov|Mrs|Ms|[A-Z]|Assn|Capt)
\.
)
| (!)
| (\?)
)
( \s* $ | \s+ ( [_$#] | [A-Z] [^.] ))
)
使用该站点的初始帮助文本,这使 powertoy.org 上的探测数量从 70000 减少到 2500 左右。 (但是 powertoy 不喜欢我的多行正则表达式或“x”标志或其他东西,所以我不得不将正则表达式压缩到一行上进行测试)。
您可以通过在标题列表中使用通用前缀来更进一步:
(?x: # Allow spacing and comments
(
(\.) # First match "."
(?<! # Then negative-look-behind for titles followed by "."
(?:Assn|C(?:apt|ol|omdr|orp|pl)|Dr|Esq|G(?:en|ov)|Hon|I(?:nc|nst)|Jr|L(?:t|td)|M(?:[rs]|rs)|Rev|S(?:gt|[rt])|[A-Z])
\.
)
| (!)
| (\?)
)
( \s* $ | \s+ ( [_$#] | [A-Z] [^.] ))
)
这使探测计数减少到大约 2000。
编辑:
减少探测计数的另一个技巧是在后视部分的开头包含一个大写字母的前瞻(但我不能肯定它会使正则表达式更有效)(还包括@Swiss's字边界建议):
(?<! # Then negative-look-behind for titles followed by "."
\b (?= [A-Z] ) # But first ensure we have a capital letter before going on
(?:Assn|C(?:apt|ol|omdr|orp|pl)|Dr|Esq|G(?:en|ov)|Hon|I(?:nc|nst)|Jr|L(?:t|td)|M(?:[rs]|rs)|Rev|S(?:gt|[rt])|[A-Z])
\.
)
关于regex - 使正则表达式更高效,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3965323/