Regex 在某些字符内匹配同一字符串两次
我需要编写一个与以下模式匹配的正则表达式:Regex 在某些字符内匹配同一字符串两次,regex,Regex,我需要编写一个与以下模式匹配的正则表达式: [[string|string]] 在特定的语法中,同一个字符串有两次(我不想匹配括号本身)。我终于想出了一个办法: (?<=\[\[)(.*)(?=\|)\|\1\]\] (?要匹配完整模式,可以更新正则表达式以包含前两个括号: 我认为您也可以不使用这种积极的前瞻(?=\\|)来匹配完整的模式,您可以更新您的正则表达式以包含前两个括号: 我想你也可以不用这种积极的前瞻(?=\\\124;) \[{2}按字面意思匹配[两次 ([^ |\
[[string|string]]
在特定的语法中,同一个字符串有两次(我不想匹配括号本身)。我终于想出了一个办法:
(?<=\[\[)(.*)(?=\|)\|\1\]\]
(?要匹配完整模式,可以更新正则表达式以包含前两个括号:
我认为您也可以不使用这种积极的前瞻(?=\\|)
来匹配完整的模式,您可以更新您的正则表达式以包含前两个括号:
我想你也可以不用这种积极的前瞻(?=\\\124;)
\[{2}
按字面意思匹配[
两次
([^ |\]]+)
将除
或]
之外的任何字符中的一个或多个捕获到捕获组1中
\\\\\\\
按字面意思匹配
\1
匹配最近捕获到捕获组1中的文本
]{2}
按字面意思匹配]
两次
\[{2}
按字面意思匹配[
两次
([^ |\]]+)
将除
或]
之外的任何字符中的一个或多个捕获到捕获组1中
\\\\\\\
按字面意思匹配
\1
匹配最近捕获到捕获组1中的文本
]{2}
按字面意思匹配]
两次
您的问题是使用贪婪匹配(.*)
(尽可能多地消费)。您应该使用不情愿匹配(.*)
(尽可能少地消费):
看
请注意,您的前瞻性(?=\\|)
是无用的。您的问题是使用贪婪的匹配(.*)
(尽可能多地消费)。您应该使用不情愿的匹配(.*)
(尽可能少地消费):
看
请注意,您的前瞻(?=\\\124;)
是无用的。“不起作用”的意思是什么?正则表达式确实起作用。如果不起作用,问题是您的代码。@Aran Fey找不到匹配项:试试。还有,哪种语言?您注意到红色的“错误:此风格中不支持lookbehind”吗消息?如果你在实际支持它的地方测试它,它会工作。@Aran Fey:发现错误,有一些奇怪的地方● 我的代码中的字符,呃。这确实匹配:“不工作”意思是什么?正则表达式可以工作。如果不匹配,问题是您的代码。@Aran Fey找不到匹配项:重试。还有,哪种语言?您注意到大红色的“错误:此风格不支持lookbehind”了吗消息?如果你在实际支持它的地方测试它,它会工作。@Aran Fey:发现错误,有一些奇怪的地方● 我代码中的字符,呃。这确实匹配:如果字符串结构异常:[[s|string]]|s | string]]]]
@ctwheels我可以接受。我愿意打赌这种输入永远不会发生在OP上。我赞成可读性。我完全同意,但我只是认为它应该作为一种可能的情况出现。我们不知道OP在字符串方面处理的是什么,所以可能是一个非常不可能的字符串(比如那个)出现并阻止了他们。(可能是用户输入,有人可以尝试破坏它)。我看不出将*
更改为*?
有什么区别。正则表达式将回溯,直到找到正确的匹配。@Aran Fey根据输入[[s]|s | s]]]
如果字符串结构异常,那么这实际上可能会失败:[[s | string]]|s | string]]]]
@ctwheels我可以接受。我愿意打赌这种输入永远不会发生在OP上。我赞成可读性。我完全同意,但我只是认为它应该作为一种可能的情况出现。我们不知道OP在字符串方面处理的是什么,所以可能是一个非常不可能的字符串(比如那个)出现并阻止了他们。(可能是用户输入,有人可以尝试破坏它)。我看不出将*
更改为*?
有什么区别。正则表达式将回溯,直到找到正确的匹配。@Aran Fey根据输入[[s]|s | s]]]
实际上,这与OP想要匹配的内容不匹配。OP希望匹配中包含方括号,但您的正则表达式只匹配string | string
这可能会产生意外的结果:[[s | s]]|s | s]]]
。然后,它也可能是正确的。实际上,这与OP想要匹配的内容不匹配。OP希望匹配中包含方括号,但您的正则表达式只匹配string | string
这可能会产生意外的结果:[[s].\124; s]]]
。然后,它也可能是正确的。
\[{2}([^|\]]+)\|\1]{2}
\[\[(.*?)\|\1\]\]