c#正则表达式排除某些字符

时间:2016-10-21 08:41:42

标签: c# regex

我正在尝试使用具有以下格式的Regex.IsMatch匹配C#中的字符串:

  

([这里有什么东西]这里的任何东西])+

示例:[mark[MARK]mark][[spacing]]将是有效字符串,但[[[spacing]spacing]将是无效字符串。

请注意

  

“这里有什么”

字符串不能包含

  

“[”或“]”

,它也可以是空的。

我尝试了类似@"(\[{1}\w*\[{1}\w*\]{1}\w*\]{1})+"的内容,但我不知道如何告诉正则表达式引擎\w*不能包含

  

“[”或“]”

谢谢!

2 个答案:

答案 0 :(得分:1)

您需要使用balancing groups,将整个表达式括在非捕获组中,并使用+(一次或多次出现)量化该组:

^(?:\[(?>[^][]+|(?<o>)\[|(?<-o>)])*(?(o)(?!))])+$

请参阅regex demo

<强>详情:

  • ^ - 字符串开头
  • (?: - 启动非捕获+ - 量化组
    • \[ - [
    • (?>[^][]+|(?<o>)\[|(?<-o>)])* - 搜索[][以外的任何1个字符(将其添加到“o”堆栈)或] (将其从“o”堆栈中删除)
    • (?(o)(?!)) - 如果组“o”不为空,则无法匹配,请查找下一个配对[...]
    • ]
  • )+ - 内部模式的一次或多次出现
  • $ - 字符串结束。

答案 1 :(得分:1)

使用此正则表达式

^(\[[^\[\]]*\[[^\[\]]*\][^\[\]]*\])+$

正则表达式的解释:

  • ^匹配字符串的开头
  • (创办一个小组
  • \[匹配开始[
  • [^\[\]]*匹配零个或多个字符串 [ ]
  • \[再次匹配[
  • [^\[\]]*匹配零个或多个字符串 [ ]
  • \]匹配结束]
  • [^\[\]]*匹配零个或多个字符串 [ ](再次)
  • \]匹配上次]
  • )结束小组
  • +量词与之前的第一组或多组相匹配
  • $匹配字符串的结尾