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\]\]