我希望有一个匹配每个[[
的正则表达式,除了这些从某些单词开头,例如:
匹配[[DEF
,但不匹配[[ABC:DEF
。
感谢您的帮助,对不起我的英语。
修改
我的正则表达式(Python)是(\[\[)|(\{\{([Tt]emplate:|)[Cc]ategory)
。
它匹配每个[[
和{{category}}
或{{Template:Category}}
或{{template:category}}
,但如果以ex开头,我不想匹配[[
。 ABC
。更多例子:
匹配[[SOMETHING
,但不匹配[[ABC: SOMETHING
,
匹配[[EXAMPLE
,但不匹配[[ABC: EXAMPLE
。
EDIT2: “定义前ABC”
我希望每个[[
匹配后不跟一些字符串,例如ABC
。
答案 0 :(得分:0)
这在很大程度上取决于您使用的regex engine。如果我可以假设它可以处理环视,那么正则表达式可能是\[\[(?!ABC)
,用于匹配两个左括号而不是,后跟三个字符ABC
。
答案 1 :(得分:0)
匹配每个
[[
,但如果以ex开头,则不匹配[[
。ABC
也许你的意思是:
\[\[(?!ABC)
......或者更像是:
\[\[(?!\w+:)
答案 2 :(得分:0)
最后,经过8年,这是一个简单的复制粘贴代码,应涵盖所有可能的情况。
将其用于“除任何单词外”时要小心,请确保将\b
放在REGEX_BEFORE
部分中,因为无论如何您都应该寻找单词。< / p>
如果您的正则表达式非常复杂,并且您需要在一个正则表达式中的两个不同位置使用此代码,请确保首次使用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 +
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)|)\]\]
这使用了相当复杂的正则表达式,即原子组,条件,后向和命名组。
(?>
是原子组的开始,这意味着它不允许回溯:这意味着,如果该组匹配一次,但后来由于后向失败而无效,则整个组将不匹配。 (在这种情况下,我们希望这种行为)。
(?<exceptions_group_1>
创建一个命名的捕获组。它比使用数字更容易。请注意,该模式首先尝试查找异常,然后在找不到异常的情况下退回到普通模式。
请注意,原子模式首先尝试查找异常,然后在找不到异常的情况下返回常规模式。
真正的魔力在(?(exceptions_group_1)
中。这是有条件的询问exceptions_group_1是否成功匹配。如果是,那么它将尝试查找always(?<=fail)
。这种模式(如它所说)将始终失败,因为它会寻找“始终”一词,然后检查“是否会“一直” =“失败””,这是永远不会失败的。
因为有条件的失败,这意味着原子组失败,并且因为它是原子的,这意味着其已经匹配了异常,因此不允许其回溯(试图查找正常模式)。
这绝对不是打算使用这些工具的方式,但它应该可靠且有效地工作。
pattern = r"(\[\[(?>(?P<exceptions_group_1>ABC: )|(SOMETHING|EXAMPLE))(?(exceptions_group_1)always(?<=fail)|))"