【问题标题】:Match same string twice within certain characters在某些字符内匹配相同的字符串两次
【发布时间】:2018-04-02 15:23:25
【问题描述】:

我需要编写一个匹配这样的模式的正则表达式:

[[string|string]]

在该特定语法中两次是相同的字符串(我不想匹配括号本身)。我设法想出了这个:

(?<=\[\[)(.*)(?=\|)\|\1\]\]

但是,由于某种原因,它不匹配,我不明白我的错误在哪里。

更新:结果它不起作用,因为我的代码很脏,并且第一个字符串中有一些 ● 字符,所以两个字符串不相等:https://regexr.com/3n7ni

删除那些无关的字符使正则表达式匹配,尽管它仍然需要调整(比如不匹配闭括号):https://regexr.com/3n7o7

【问题讨论】:

  • “不起作用”到底是什么意思?该正则表达式有效。如果不是,则问题出在您的代码上。
  • @Aran-Fey 未找到匹配项:regexr.com/3n7ni
  • 试试\[{2}([^|\]]+)\|\1]{2}。另外,哪种语言?
  • 您是否注意到大红色的“错误:此风味不支持后视”消息?如果您在实际支持它的地方对其进行测试,它就可以工作。
  • @Aran-Fey:发现错误,我的代码中有一些奇怪的 ● 字符,呃。这确实匹配:regexr.com/3n7o7

标签: regex


【解决方案1】:

See regex in use here

\[{2}([^|\]]+)\|\1]{2}
  • \[{2} 匹配 [ 字面意思,两次
  • ([^|\]]+) 捕获除|] 之外的任何字符中的一个或多个到捕获组1
  • \| 匹配 | 字面意思
  • \1 匹配最近捕获到捕获组 1 中的文本
  • ]{2} 匹配 ] 字面意思,两次

【讨论】:

    【解决方案2】:

    要匹配完整模式,您可以更新正则表达式以包含前 2 个括号:

    \[\[(.*)\|\1\]\]

    我认为你也可以不用这种积极的前瞻(?=\|)

    【讨论】:

    • 其实这和OP想要匹配的不匹配。 OP 希望匹配中包含方括号,但您的正则表达式仅匹配 string|string
    • 这可能会产生意想不到的结果:[[s|s]]|s|s]]]]。话又说回来,它也可能是正确的。
    【解决方案3】:

    您的问题是使用了贪婪匹配(.*)(尽可能消耗)。你应该使用不情愿匹配(.*?)(尽可能少消耗):

    \[\[(.*?)\|\1\]\]
    

    live demo

    请注意,您向前看(?=\|) 是没有用的。

    【讨论】:

    • 考虑到结构异常的字符串,这实际上可能会失败:[[s|string]]|s|string]]]]
    • @ctwheels 我可以忍受。我愿意赌大钱,这样的投入永远不会发生在 OP 上。我喜欢可读性。
    • 我完全同意,但我只是认为它应该作为一个可能的案例提出。我们并不真正知道 OP 在字符串方面正在处理什么,因此很可能会出现一个非常不可能的字符串(例如那个字符串)并阻碍它们。 (可能是用户输入,有人可以尝试破解)。
    • 我看不出将.* 更改为.*? 有什么不同。正则表达式将回溯,直到找到正确的匹配项。
    • @Aran-Fey 尝试输入 [[s|s]]|s|s]]]]
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-03-24
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-09-06
    相关资源
    最近更新 更多