我正在尝试使用正则表达式来匹配以下两种字符串类型:
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正则表达式工具。
我在处理复杂的表达式时总是用它。