【问题标题】:Regexp match optional group unless it's got something inside it正则表达式匹配可选组,除非它里面有东西
【发布时间】:2014-01-22 02:54:39
【问题描述】:

我正在玩这个正则表达式:http://regex101.com/r/dL3qX1

!\[(.*?)\](?:\(\)|\[\])?

以下所有字符串都应匹配。但是,如果第二组括号(可选)在其中包含任何内容,则正则表达式不应匹配任何内容。

// Match
![]
![caption]
![]()
![caption]()
![][]
![caption][]

// No match
![][No match]
![caption][No match]
![](No match)
![caption](No match)

我应该仍然能够匹配在行尾有文本的示例。

![] hello
![caption][] hi there

换句话说,如果没有可选组,我只想要一个匹配,或者如果有,我只想要一个匹配,如果可选组为空(括号之间没有)。

我所追求的可能吗?

【问题讨论】:

    标签: javascript regex


    【解决方案1】:

    当涉及到括号时,我个人更喜欢使用否定类:

    ^!\[([^\[\]]*)\](?:\(\)|\[\])?$
    

    regex101 demo

    我将(.*?)替换为[^\[\]]*,分别在开头和结尾添加了^$

    也就是说,如果我正确理解了您要查找的内容,则只有第一组匹配。

    【讨论】:

    • 与anubhava 的回答类似的问题。如果我在行尾添加任何内容,则不匹配。我还是想匹配![caption][] hey there
    • @JumbalayaWanton 这意味着我不明白你的问题。请注意,匹配和捕获之间存在差异。当您将内容放在括号 ( ... ) 中时会发生捕获,并且当字符串通过正则表达式时会发生匹配。当第二组括号中有某些内容时,您的意思是不想捕获caption
    • 对不起,杰瑞,我添加了其他示例。基本上,你给我的东西很完美,但它必须在自己的路线上。它不能在任何东西之前或之后。哪一个,想想看,也许还好。 +1 但我还是很好奇。
    • 其实,不要浪费你的时间。我认为这应该满足我的需求。谢谢。
    • 好吧,好吧,我最后要指出的是,我的正则表达式是捕获第一个括号内的文本的那个;)
    【解决方案2】:

    你可以使用这个正则表达式:

    ^!\[[^\]]*\](?:\(\)|\[\])?$
    

    工作演示:http://regex101.com/r/eX0sR8

    注意在第一个方括号中使用[^\]]* 而不是.*?,这确保匹配到第一个]。最好使用行开始/结束锚^ and $

    【讨论】:

    • 问题在于该行必须结束。如果我在之后添加其他内容,则没有匹配项。
    • 提供一些你想要匹配的例子,然后我可以调整它。
    • 哦,好吧,对不起,我对您对杰瑞的回答的评论感到困惑。现在回滚。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2020-10-13
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2010-11-15
    • 1970-01-01
    相关资源
    最近更新 更多