C# 需要帮助破译正则表达式吗
我尝试使用正则表达式来匹配以下两种字符串类型:C# 需要帮助破译正则表达式吗,c#,regex,string,C#,Regex,String,我尝试使用正则表达式来匹配以下两种字符串类型: Name(p0, p1,...pN) 以及: 我目前正在使用正则表达式: @"[a-z]+\([^()]+\)" [a-z]+\([^()]+\) ^ ^ ^ ^ ^ ^ | | | | | | | | | | | +-- The closing parenthesis | | | | +---- Repeated one or more time | | | +------- Any chara
Name(p0, p1,...pN)
以及:
我目前正在使用正则表达式:
@"[a-z]+\([^()]+\)"
[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] = Match any character from a to z
我不太确定:
[^()] ?= Match any character between '(' and ')'
我相信它属于a,表示为:
\([^()]+\)
但我还是不确定
目前,该表达式适用于:
Name(p0, p1,...pN)
但当括号之间没有逗号分隔字符时,我无法使其匹配。即:
Name()
为什么表达式在第二个表达式中失败
编辑:
从您的回答中,我确定了以下内容(如有错误,请更正):
使用
*
而不是靠近末尾的+
@"[a-z]+\([^()]*\)"
[^()]+
部分表示一个或多个类([^…]
)的负匹配([^…]
),例如不在括号(()
)中(+
)。但是您希望它是零次或多次(*
),这样即使没有元素,它也会匹配。使用*
而不是靠近末尾的+
@"[a-z]+\([^()]*\)"
[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
[^()]+
部分表示一个或多个类([^…]
)的负匹配([^…]
),例如不在括号(()
)中(+
)。但您希望它是零次或多次(*
),以便即使没有元素,它也能匹配
[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次或更多次
括号不构成一个组-它们用“\”转义
正如Billy Moon所说,在第三个“部分”中使用*而不是+匹配“括号内的非括号”0次或更多次,而不是1次或更多次
括号不构成一个组-它们用“\”转义
我不太确定:[^()]
这是一个字符类,意思是“非a(或a)”的东西
这有点贪婪。(具体取决于您的要求,是否允许换行等)
我相信它属于一个由()
如果不是通过反斜杠逃脱,它将是一个团体。像这样,它告诉正则表达式寻找括号
我建议这样做:
@"[A-Za-z]+\(([\w,. ])*\)"
如果。。。在您最初的示例中,这个问题只是一个简短的版本,并且实际数据不包含点,您也可以从字符类中删除点
我不太确定:[^()]
这是一个字符类,意思是“非a(或a)”的东西
这有点贪婪。(具体取决于您的要求,是否允许换行等)
我相信它属于一个由()
如果不是通过反斜杠逃脱,它将是一个团体。像这样,它告诉正则表达式寻找括号
我建议这样做:
@"[A-Za-z]+\(([\w,. ])*\)"
如果。。。在您的原始示例中,此问题只是一个简短版本,而实际数据不包含点,您也可以从字符类中删除点。以下是对表达式的解释:
@"[a-z]+\([^()]+\)"
[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]+\([^()]+\)"
[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
唯一出错的部分是[^()]
子表达式:开头的^
字符将其含义更改为“排除”字符类的其余字符,而不是“包含”
如果要匹配一对空括号,请将最后一个+
替换为*
,以将含义从“一个或多个”更改为“任何数字,包括零”。请尝试
在处理复杂表达式时,我总是使用它。试试这个
我总是在处理复杂表达式时使用它。您可能需要添加问题中要求的解释;)您可能需要添加问题中要求的解释;)你有没有考虑过读一本基本的正则表达式介绍?@phant0m为了达到这个目的,我很肯定他读过一本基本的介绍。Regex看起来有点神秘,这个论坛的目的是能够提出类似的问题。从突然涌入的答案中,我可以得到更多的答案。谢谢所有那些已经发布的人!你有没有考虑过读一本基本的正则表达式介绍?@phant0m为了达到这个目的,我很肯定他读过一本基本的介绍。Regex看起来有点神秘,这个论坛的目的是能够提出类似的问题。从突然涌入的答案中,我可以得到更多的答案。谢谢所有那些已经发布的人+关于
[^()]
-可能过度贪婪的评论,我将在我的答案中添加相同的内容。+1关于[^()]
-可能过度贪婪的评论,我将在我的答案中添加相同的内容。最清晰的正则表达式解释我看到了最清晰的正则表达式解释