2013-04-28 46 views
1

我试图用一个正则表达式匹配以下两个字符串类型:需要一些帮助破译正则表达式

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

你有没有考虑阅读基本的正则表达式介绍? – phant0m 2013-04-28 20:46:36

+1

@ phant0m得到这个很远,我很确定他已经读了一个基本的介绍。正则表达式看起来有点神秘,这个论坛的重点是能够提出有关这样的事情的问题。 – 2013-04-28 20:50:08

+0

从突然涌入的答案中,我可以获得更多。感谢所有发布的人! – user1423893 2013-04-28 21:00:03

回答

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 

像比利Moon说,用*代替在第三个“部分” +匹配0次或更多次,而不是1次以上“括号内的非括号”。

括号不构成一个组 - 它们被转义为“\”。

3

使用*而不是+接近尾声...

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

[^()]+部分表示否定匹配类([^...]),如不在括号内(())或更多次(+)。但是,您希望它是零次或多次(*),以便即使在没有元素时也能匹配。

+4

您可能想要添加一个*解释*,该问题需要提供; * – phant0m 2013-04-28 20:45:44

1

我不太肯定的:^()]

这是一个字符类,意思是“未尝不是一个(或)” 这是一个有点贪心。 (真的取决于你的要求,允许换行等。)

我认为它属于记一组:)(

这将是一个组,如果它没有被反斜杠转义。像这样,它会告诉正则表达式寻找大括号。

我建议是这样的:

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

如果...你原来的例子仅仅是这个问题的缩短版,与实际数据中包含不点,你可能会删除点从角色类也是如此。

+0

+1,关于'[^()]'可能过度贪婪的评论 - 即将添加到我的答案中。 – JimmiTh 2013-04-28 20:55:07

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 

,你有错的是[^()]子表达式的唯一部分“包括”字符类的其余字符。

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

+0

我见过的最清晰的正则表达式解释 – Jonesopolis 2013-04-29 03:35:19