我试图创建一个与表达式开头和结尾处的字符匹配的正则表达式,但在任何一个地方都没有字符。我知道我可以使用|
和两个完整的表达式来做到这一点,但是有可能在一个表达式中这样做吗?
示例文字:
This is some groovy_[Item]text[/Item]_right here. And here's some_[Item]more[/Item].
当前正则表达式:
_?\[Item\]([^\[]+)\[\/Item\]_?
对于上述内容,正则表达式将匹配_[Item]text[/Item]_
和_[Item]more[/Item]
。但是,对于第二场比赛,我不想要领先_,因为尾随_不在那里。
我显然可以使用这个正则表达式,它可以工作:
_\[Item\]([^\[]+)\[/Item\]_|\[Item\]([^\[]+)\[/Item\]
我只是想知道是否有办法在不增加表达能力的情况下做到这一点。
答案 0 :(得分:2)
您可以在空格后使用?
运算符使其成为可选项,捕获并引用它:
(_?)\[Item](.*?)\[/Item]\1
^------------ Here ----^
<强> Working demo 强>
答案 1 :(得分:2)
您可以在.NET中使用条件正则表达式:
( )?\[Item\]([^\[]+)\[/Item\](?(1) )
请参阅regex demo
在这里,我们将可选空格与( )?
匹配,然后,如果我们匹配它,我们还希望将空格与(?(1) )
匹配。
如果要匹配任何Unicode空格,请使用\p{Zs}
而不是空格。