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