1

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

Name(p0, p1,...pN)

和:

Name()

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

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

我可以理解:

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

我不太确定:

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

我相信它属于一个由以下表示的

\([^()]+\)

但同样,我不确定。

目前,该表达式适用于:

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 ')'
4

5 回答 5

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 次或更多次。

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

于 2013-04-28T20:49:52.630 回答
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

您唯一弄错的部分是[^()]子表达式:^开头的字符将其含义更改为“不包括”而不是“包含”字符类的其余字符。

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

于 2013-04-28T20:52:59.953 回答
3

使用*而不是+接近尾声...

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

[^()]+部分表示否定匹配一个类 ( [^...]),因为不是括号 ( ()) 一次或多次 ( +)。但是您希望它是零次或多次 ( *),以便即使没有元素也能匹配。

于 2013-04-28T20:45:15.087 回答
1

我不太确定:[^()]

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

我相信它属于一个由以下表示的组:()

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

我建议这样的事情:

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

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

于 2013-04-28T20:51:36.533 回答
0

试试Expresso 正则表达式工具

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

于 2013-04-28T23:48:46.670 回答