如何反转任意Regex表达式

时间:2015-07-01 16:13:45

标签: regex

这个问题听起来像是重复的,但是我已经看了很多类似的问题,但是没有一个能够适合这个法案,因为他们将问题限制在一个非常具体的例子或者特定的用户案例中(例如:单身)只有chars)或者因为你需要替换成功的方法,或者因为你需要使用编程语言(例如:C#&split,或者Match()。Value。)。

我希望能够获得任意Regex表达式的反转,以便除了找到的匹配之外所有内容都匹配。

例如,让我们说我想找到正则表达式的反面" over"在"母牛跳过月亮",它将匹配The cow jumps并匹配the moon

当然,这只是一个简单的例子。正则表达式可能更混乱,例如&#34; o。*?m&#34;,在这种情况下,匹配将是:The cpsoon。< / p>

这是我one possible solution经过多年的狩猎后发现的。不幸的是,它需要在替换领域中使用替换,我希望保持清楚。此外,其他一切都是匹配的,但只是逐个字符而不是大块。

再次强调,答案应该是任意正则表达式的通用目的,而不是特定于任何特定示例。

2 个答案:

答案 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)

不幸的是,没有任何神奇的方法来否定模式。

正如您在问题中提到的那样,当您使用匹配方法的高效模式时,为了获得补充,更简单(和更有效)的方法是使用具有相同模式的拆分方法。

要使用模式本身,解决方法是:

1。消耗与模式匹配的字符

“其他内容”是直到下一个模式或字符串结尾的内容。

交替+捕获组:

(pattern)|other content

然后您必须检查捕获组是否存在以了解更改的哪个部分成功。

“其他内容”可以用这种方式描述:.*?(?=pattern|$)

使用PCRE和Perl,您可以使用回溯控制动词来避开捕获组,但想法是一样的:

pattern(*SKIP)(*FAIL)|other content

使用此变体,您不需要在之后检查任何内容,因为第一个分支被强制失败。

不做更改:

((?:pattern)*)(other content)
具有\K功能的PCRE,Perl或Ruby中的

变体:

(?:pattern)*\Kother content

\K从匹配结果中删除左边的所有内容。

2。逐个检查字符串的字符

(?:(?!pattern).)*

如果这种方式写得非常简单(如果前瞻可用),那么它很容易变慢,因为字符串的每个位置都是用前瞻来测试的。

如果你可以使用模式的第一个字符(比如“a”),可以减少先行测试的数量:

[^a]*(?:(?!pattern)a[^a]*)*

3。列出所有不是模式。

使用字符类

让我们说你的模式是/hello/

([^h]|h(([^eh]|$)|e(([^lh]|$)|l(([^lh]|$)|l([^oh]|$))))*

当字符数很重要时,这种方式变得很快,但它对于没有POSIX正则表达式等功能的正则表达式有用。