保持错误条件允许轮换匹配

时间:2014-11-12 22:07:05

标签: .net regex

以下正则表达式匹配由单引号(所需)包围的单词字符序列。它还匹配一对空单引号(不需要)。 如何保持此表达式不匹配空引号?

'(\w|(?(bracket)-))+'

我正在使用.Net的reg ex引擎。

我想出的

如果指定的捕获组bracket不存在,则(?(bracket)-)子句显然评估为空,有效地将表达式转换为匹配引号后跟一个或多个单词字符的表达式或没有其他引用。实质上:

'(\w|)+'

要解决此问题,可以修改条件以包含 no 子句,该子句从交替的第一部分开始重复\w

'(\w|(?(bracket)-|\w))+'

然而,这引入了我想要避免的补充。在这个简单的例子中,重复是可以忍受的,但它不会出现在我尝试使用这个概念构建的更复杂的表达中。

1 个答案:

答案 0 :(得分:1)

你可以尝试这个'(\w|(?(bracket)-|(?!)))+'

 ## Subexpression to define 'bracket' group
 ## up here

 '                     # Quote char
 (                     # (1 start)
      \w                    # word char
   |                      # or,
      (?(bracket)           # Conditional: Did 'bracket' group match something?
           -                     # Yes, match '-'
        |                      # or,  
           (?!)                  # No, fail this part
      )
 )+                    # (1 end)
 '                     # Quote char

例如(?<bracket>\[)?'(\w|(?(bracket)-|(?!)))+'

将匹配['st-art'['-'
但不是='st-art'也不是='-'
从不''空引号