正则表达式例外

时间:2011-08-05 08:13:21

标签: regex

我希望有一个匹配每个[[的正则表达式,除了这些从某些单词开头,例如:

匹配[[DEF,但不匹配[[ABC:DEF

感谢您的帮助,对不起我的英语。

修改 我的正则表达式(Python)是(\[\[)|(\{\{([Tt]emplate:|)[Cc]ategory)

它匹配每个[[{{category}}{{Template:Category}}{{template:category}},但如果以ex开头,我不想匹配[[ABC。更多例子:

匹配[[SOMETHING,但不匹配[[ABC: SOMETHING

匹配[[EXAMPLE,但不匹配[[ABC: EXAMPLE

EDIT2: “定义前ABC”

我希望每个[[匹配后不跟一些字符串,例如ABC

3 个答案:

答案 0 :(得分:0)

这在很大程度上取决于您使用的regex engine。如果我可以假设它可以处理环视,那么正则表达式可能是\[\[(?!ABC),用于匹配两个左括号而不是,后跟三个字符ABC

答案 1 :(得分:0)

  

匹配每个[[,但如果以ex开头,则不匹配[[ABC

也许你的意思是:

\[\[(?!ABC)

......或者更像是:

\[\[(?!\w+:)

答案 2 :(得分:0)

最后,经过8年,这是一个简单的复制粘贴代码,应涵盖所有可能的情况。

当心:

  1. 将其用于“除任何单词外”时要小心,请确保将\b放在REGEX_BEFORE部分中,因为无论如何您都应该寻找单词。< / p>

  2. 如果您的正则表达式非常复杂,并且您需要在一个正则表达式中的两个不同位置使用此代码,请确保首次使用exceptions_group_1,对于exceptions_group_2等等。请阅读下面的说明以更好地理解这一点。


复制/粘贴代码:

在以下正则表达式中,仅将全部大写部分替换为您的正则表达式。

Python正则表达式
pattern = r"REGEX_BEFORE(?>(?P<exceptions_group_1>EXCEPTION_PATTERN)|YOUR_NORMAL_PATTERN)(?(exceptions_group_1)always(?<=fail)|)REGEX_AFTER"
Ruby正则表达式
pattern = /REGEX_BEFORE(?>(?<exceptions_group_1>EXCEPTION_PATTERN)|YOUR_NORMAL_PATTERN)(?(<exceptions_group_1>)always(?<=fail)|)REGEX_AFTER/
PCRE正则表达式
REGEX_BEFORE(?>(?<exceptions_group_1>EXCEPTION_PATTERN)|YOUR_NORMAL_PATTERN)(?(exceptions_group_1)always(?<=fail)|)REGEX_AFTER
的JavaScript

从2020年6月17日起是不可能的,并且在不久的将来将不可能。



完整示例

REGEX_BEFORE = [[
YOUR_NORMAL_PATTERN = \ w + \ d *
REGEX_AFTER =]]
EXCEPTION_PATTERN = MyKeyword \ d +

Python正则表达式
pattern = r"\[\[(?>(?P<exceptions_group_1>MyKeyword\d+)|\w+\d*)(?(exceptions_group_1)always(?<=fail)|)\]\]"
Ruby正则表达式
pattern = /\[\[(?>(?<exceptions_group_1>MyKeyword\d+)|\w+\d*)(?(<exceptions_group_1>)always(?<=fail)|)\]\]/
PCRE正则表达式
\[\[(?>(?<exceptions_group_1>MyKeyword\d+)|\w+\d*)(?(exceptions_group_1)always(?<=fail)|)\]\]



它如何工作?

这使用了相当复杂的正则表达式,即原子组,条件,后向和命名组。

  1. (?>是原子组的开始,这意味着它不允许回溯:这意味着,如果该组匹配一次,但后来由于后向失败而无效,则整个组将不匹配。 (在这种情况下,我们希望这种行为)。

  2. (?<exceptions_group_1>创建一个命名的捕获组。它比使用数字更容易。请注意,该模式首先尝试查找异常,然后在找不到异常的情况下退回到普通模式。

  3. 请注意,原子模式首先尝试查找异常,然后在找不到异常的情况下返回常规模式。

  4. 真正的魔力在(?(exceptions_group_1)中。这是有条件的询问exceptions_group_1是否成功匹配。如果是,那么它将尝试查找always(?<=fail)。这种模式(如它所说)将始终失败,因为它会寻找“始终”一词,然后检查“是否会“一直” =“失败””,这是永远不会失败的。

  5. 因为有条件的失败,这意味着原子组失败,并且因为它是原子的,这意味着其已经匹配了异常,因此不允许其回溯(试图查找正常模式)。

这绝对不是打算使用这些工具的方式,但它应该可靠且有效地工作。



原始问题的准确答案:

pattern = r"(\[\[(?>(?P<exceptions_group_1>ABC: )|(SOMETHING|EXAMPLE))(?(exceptions_group_1)always(?<=fail)|))"