【发布时间】:2018-07-05 12:19:55
【问题描述】:
我正在为 Google Docs 编写一个免费插件并处理文本段落。
我需要一个正则表达式来匹配除短语(即用空格分隔的多个单词)之外的所有内容。
例如,当搜索文本The quick brown fox jumped over the lazy dog 时,我想匹配除quick brown 和lazy 之外的所有内容,预期结果为The fox jumped over the dog。
\b((?!(lazy)\b).)+
这行得通;它匹配除lazy 之外的所有文本,我得到The quick brown fox jumped over the dog。
\b((?!(quick brown|lazy)\b).)+
这不起作用;它离开brown,当我应该得到The fox jumped over the dog时我得到The brown fox jumped over the dog
我已经在网上搜索了几个小时,但没有任何运气。正则表达式缺少一些东西,我不知道它是什么。
感谢阅读!
正则表达式示例:https://regex101.com/r/3HGiff/1
Javascript 示例:https://jsfiddle.net/g85je2aj/16/
编辑/更新:我开发了另一个解决方案,但它依赖于积极的后视,只有 Chrome 支持。
((?<=(quick brown|lazy)+(?=[\s]))|^(?!(quick brown|lazy))).+?((?=(quick brown|lazy))|$)
正则表达式示例:https://regex101.com/r/3HGiff/3
Javascript 示例:https://jsfiddle.net/g85je2aj/19/
由于这只适用于 Chrome,我认为这不是一个真正的解决方案。关于如何修改该正则表达式以不使用后视的任何想法,或者这是不可能的?
【问题讨论】:
-
您拥有的正则表达式首先匹配每个单词边界,然后匹配任何字符,1+ 次出现,这不是某些序列的起点。它最多匹配
word中的w,或two中的t,因此匹配one或two之后的下一个单词边界,并继续匹配下一个one或@987654344 @. -
感谢 Wiktor 的解释。不幸的是,我不认为我离答案更近了。
-
你很亲密。您不需要匹配任何文本,但需要匹配其他一些文本。只需分享一个示例测试用例,JS 中的一个 sn-p(使用 jsfiddle.net 或在问题中添加代码)并解释您需要得到什么结果。
-
感谢 Wiktor,我在 regex101 和 jsfiddle 上都用更好的例子更新了这篇文章。
-
如果我是你,我会匹配给定的短语并使用
replaceAll删除它们
标签: javascript regex regex-negation