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关于
[^()]
-可能过度贪婪的评论,我将在我的答案中添加相同的内容。最清晰的正则表达式解释我看到了最清晰的正则表达式解释