匹配结束和开始字符或两者都不匹配

时间:2015-10-02 19:44:38

标签: .net regex

我试图创建一个与表达式开头和结尾处的字符匹配的正则表达式,但在任何一个地方都没有字符。我知道我可以使用|和两个完整的表达式来做到这一点,但是有可能在一个表达式中这样做吗?

示例文字:

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

我只是想知道是否有办法在不增加表达能力的情况下做到这一点。

2 个答案:

答案 0 :(得分:2)

您可以在空格后使用?运算符使其成为可选项,捕获并引用它:

(_?)\[Item](.*?)\[/Item]\1
  ^------------ Here ----^

<强> Working demo

enter image description here

答案 1 :(得分:2)

您可以在.NET中使用条件正则表达式:

( )?\[Item\]([^\[]+)\[/Item\](?(1) )

请参阅regex demo

enter image description here

在这里,我们将可选空格与( )?匹配,然后,如果我们匹配它,我们还希望将空格与(?(1) )匹配。

如果要匹配任何Unicode空格,请使用\p{Zs}而不是空格。