这个问题听起来像是重复的,但是我已经看了很多类似的问题,但是没有一个能够适合这个法案,因为他们将问题限制在一个非常具体的例子或者特定的用户案例中(例如:单身)只有chars)或者因为你需要替换成功的方法,或者因为你需要使用编程语言(例如:C#&split,或者Match()。Value。)。
我希望能够获得任意Regex表达式的反转,以便除了找到的匹配之外所有内容都匹配。
例如,让我们说我想找到正则表达式的反面" over"在"母牛跳过月亮",它将匹配The cow jumps
并匹配the moon
。
当然,这只是一个简单的例子。正则表达式可能更混乱,例如" o。*?m",在这种情况下,匹配将是:The c
,ps
和oon
。< / p>
这是我one possible solution经过多年的狩猎后发现的。不幸的是,它需要在替换领域中使用替换,我希望保持清楚。此外,其他一切都是匹配的,但只是逐个字符而不是大块。
再次强调,答案应该是任意正则表达式的通用目的,而不是特定于任何特定示例。
答案 0 :(得分:0)
来自帖子:I want to be able to get the reverse of any arbitrary Regex expression, so that everything is matched EXCEPT the found match.
答案 -
一场比赛 Not Discontinuous ,它是连续的!!
每场比赛都是连续不间断的子串。所以,在每场比赛中都有 是不跳过该子字符串中的任何内容。无论什么匹配 正则表达式包含在特定匹配结果中。
因此,在单个匹配中,没有反转(即不仅仅是匹配)可以延长 一件好事。
这是正则表达式的Tennant。
此外,在这种情况下,由于你只想要所有 NOT 的东西,你有 在这个过程中消费那些东西 只需捕获您想要的内容即可轻松完成。
所以,即使有多场比赛,也不足以说(?:(?!\bover\b).)+
因为即使它匹配(但不是) over ,在下一场比赛中
它将匹配ver ...
。
有一些方法可以避免这种繁琐,需要可变长度的外观
但是,最简单的方法是匹配up to
,然后over
,然后the rest
。
几个结构可以帮助。一个是\K
。
答案 1 :(得分:0)
不幸的是,没有任何神奇的方法来否定模式。
正如您在问题中提到的那样,当您使用匹配方法的高效模式时,为了获得补充,更简单(和更有效)的方法是使用具有相同模式的拆分方法。
要使用模式本身,解决方法是:
“其他内容”是直到下一个模式或字符串结尾的内容。
交替+捕获组:
(pattern)|other content
然后您必须检查捕获组是否存在以了解更改的哪个部分成功。
“其他内容”可以用这种方式描述:.*?(?=pattern|$)
使用PCRE和Perl,您可以使用回溯控制动词来避开捕获组,但想法是一样的:
pattern(*SKIP)(*FAIL)|other content
使用此变体,您不需要在之后检查任何内容,因为第一个分支被强制失败。
或不做更改:
((?:pattern)*)(other content)
具有\K
功能的PCRE,Perl或Ruby中的变体:
(?:pattern)*\Kother content
\K
从匹配结果中删除左边的所有内容。
(?:(?!pattern).)*
如果这种方式写得非常简单(如果前瞻可用),那么它很容易变慢,因为字符串的每个位置都是用前瞻来测试的。
如果你可以使用模式的第一个字符(比如“a”),可以减少先行测试的数量:
[^a]*(?:(?!pattern)a[^a]*)*
使用字符类
让我们说你的模式是/hello/
:
([^h]|h(([^eh]|$)|e(([^lh]|$)|l(([^lh]|$)|l([^oh]|$))))*
当字符数很重要时,这种方式变得很快,但它对于没有POSIX正则表达式等功能的正则表达式有用。