需要一些帮助来解密正则表达式



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

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

括号不构成一个组,它们用"\"转义。

以下是对表达式的解释:

[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

唯一出错的部分是[^()]子表达式:开头的^字符将其含义更改为"不包括",而不是"包括"字符类的其他字符。

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

在末尾附近使用*而不是+。。。

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

[^()]+部分意味着与类([^...](负匹配,如在非括号(()(中一次或多次(+(。但您希望它为零次或更多次(*(,以便即使没有元素也能匹配。

我不太确定:[^((]

这是一个字符类,意思是"不是(或(的东西"这有点贪婪。(实际上取决于您的要求,是否允许换行等(

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

如果不是用反斜杠转义的话,它将是一个组。像这样,它告诉regex查找大括号。

我建议这样做:

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

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

尝试Expresso正则表达式工具。

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

相关内容

  • 没有找到相关文章