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

4

我已经成功使用以下方法获取所有字母(至少是空格之前的):

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

然而,我希望匹配的是(而非空格…我该怎么做?

不包含括号'('的匹配


这将包括'('..我怎么能没有它? - Theun Arbeider
你当前的表达式也匹配了空格。在两种情况下获取第1组的值。另外,以^.*开头是没有意义的;直接将其删除即可。 - Ry-
1
从您的描述中,我怀疑 [A-Z][a-z].* 并不像您想象的那样工作。 - JoeG
3个回答

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

参考: 正则表达式语言-快速参考(MSDN)

编辑: 实际上,如Casimir在他的答案中所指出的,使用.*?可能比较麻烦,使用[^\)]*可能更容易。在字符类(字符类是[...]构造)中使用的^反转了其含义,因此它不是“这些字符中的任何一个”,而是“除了这些字符之外的任何一个”。因此,使用该结构的表达式将是:

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

这仍然包括匹配中的'(',有没有办法将其排除在外,并匹配到并且不包括'('? - Theun Arbeider
是的,请看我的编辑。我已经包含了一个结构,应该可以实现你想要的功能。 - rossipedia
第一个完美地工作,但第二个却没有任何匹配。 - Theun Arbeider
仅供参考,[a-zA-Z]*? 中的非贪婪量词没有起到任何有用的作用。与 .*.*? 不同,[a-zA-Z]* 无法匹配 (,因此您不需要偷偷摸摸地查找匹配项。 - Alan Moore
@AlanMoore 很好的观点!回答已经编辑过了。不仅如此,由于 [a-zA-Z] 无法匹配 (,在实际使用中,该表达式并不是很有帮助,而第一个表达式更有意义。 - rossipedia
显示剩余2条评论

3

使用限制字符类是最好的方法

@"^[^(]*" 

[^(]表示除了(之外的所有字符。

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


0

您可以使用这个模式:

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

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

或者使用 非贪婪量词 来产生相同的基本行为:

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

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接