需要一些帮助来破译正则表达式

时间:2013-04-28 20:42:38

标签: c# regex string

我正在尝试使用正则表达式来匹配以下两种字符串类型:

Name(p0, p1,...pN)

Name()

我目前正在使用正则表达式:

@"[a-z]+\([^()]+\)"

我能理解:

[a-z]        = Match any character from a to z

我不太确定:

[^()]        ?= Match any character between '(' and ')'

我认为它属于group,表示为:

\([^()]+\)

但是,我不确定。

目前该表达式适用于:

Name(p0, p1,...pN)

但是当括号之间没有逗号分隔符时,我无法匹配它。那就是:

Name()

为什么第二个表达式失败?

编辑:

根据你的回答,我确定了以下内容(如果错误,请纠正我):

         +            = ONE or more times
         *            = ZERO or more times
         []           = Groups characters to match or ignore
         ^            = Logical NOT

         [a-z]+       = Match a lowercase letter (ONE or more times) 
         \(           = Match the character '('
         [^()]*       = Match anything that's NOT '(' or ')' (ZERO or more times)
         \)           = Match the character ')'

5 个答案:

答案 0 :(得分:5)

[a-z]+       = Match any character from a to z, 1 or more times
\(           = Match "(" literally
[^()]+       = Match anything that's NOT "(" or ")", 1 or more times
\)           = Match ")" literally

就像Billy Moon说的那样,在第三个“部分”中使用*代替+来匹配“括号内的非括号”0次或更多次,而不是1次或更多次。

括号不构成一个组 - 它们以“\”转义。

答案 1 :(得分:4)

以下是对你的表达的解释:

[a-z]+\([^()]+\)
  ^  ^ ^  ^  ^ ^
  |  | |  |  | |
  |  | |  |  | +-- The closing parenthesis
  |  | |  |  +---- Repeated one or more time
  |  | |  +------- Any character other than '(' or ')'
  |  | +---------- The opening parenthesis
  |  +------------ Repeated one or more time
  +--------------- A lowercase letter

你唯一错误的部分是[^()]子表达式:开头的^字符改变其含义为"排除"而不是"包括"字符类的其余字符。

如果您想匹配一对空括号,请将最后一个+替换为*,以更改"一个或多个"的含义。至"任何数字,包括零"。

答案 2 :(得分:3)

在结尾附近使用*代替+ ...

@"[a-z]+\([^()]*\)"

[^()]+部分意味着与一个类([^...])产生负面匹配,而不是支架(())一次或多次(+)。但是你希望它是零次或多次(*),这样即使没有元素也能匹配。

答案 3 :(得分:1)

  

我不太确定:[^()]

这是一个字符类,意思是“不是(或者)”的东西 这有点贪心。 (真的取决于你的要求,允许换行等。)

  

我认为它属于一个由以下组成的组:()

如果它没有被反斜杠转义,它将是一个组。像这样,它告诉正则表达式寻找大括号。

我建议这样的事情:

@"[A-Za-z]+\(([\w,. ])*\)"

如果原始示例中的...只是此问题的缩短版本,并且实际数据不包含点,则您也可以从字符类中删除点。

答案 4 :(得分:0)

尝试Expresso Regular Expression Tool

在处理复杂的表达式时,我总是使用它。