匹配一个字符串,直到遇到'('

时间:2013-06-29 22:11:14

标签: c# regex

我设法使用以下内容将所有内容(好的,所有字母)都放到空白处:

@"^.*([A-Z][a-z].*)]\s" 

但是,我希望匹配(而不是空格...我该如何管理?

没有匹配中的'('

3 个答案:

答案 0 :(得分:9)

如果你想要的是在(字符之前匹配任何字符,那么这应该有效:

@"^.*?(?=\()"

如果你想要所有的字母,那么这应该可以解决问题:

@"^[a-zA-Z]*(?=\()"

说明:

^           Matches the beginning of the string

.*?         One or more of any character. The trailing ? means 'non-greedy', 
            which means the minimum characters that match, rather than the maximum

(?=         This means 'zero-width positive lookahead assertion'. That means that the 
            containing expression won't be included in the match.

\(          Escapes the ( character (since it has special meaning in regular 
            expressions)

)           Closes off the lookahead

[a-zA-Z]*?  Zero or more of any character from a to z, or from A to Z

参考:Regular Expression Language - Quick Reference (MSDN)

编辑:实际上,正如卡西米尔在回答中指出的那样,使用.*?可能更容易,而不是使用[^\)]*。在字符类中使用的^(字符类是[...]构造)反转了含义,因此它代替“任何这些字符”,它意味着“除之外的任何这些人物“。所以使用该结构的表达式将是:

@"^[^\(]*(?=\()"

答案 1 :(得分:3)

使用约束字符类是最好的方法

@"^[^(]*" 

[^(]表示除(

之外的所有字符

请注意,您不需要捕获组,因为您需要的是整个模式。

答案 2 :(得分:0)

您可以使用此模式:

([A-Z][a-z][^(]*)\(

该组将匹配大写拉丁字母,后跟小写拉丁字母,后跟除开括号之外的任意数量的字符。请注意,^.*不是必需的。

或者,这会产生相同的基本行为,但使用non-greedy quantifier代替:

([A-Z][a-z].*?)\(