正则表达式只匹配一个不以")"结尾的字符串

时间:2015-03-20 02:16:47

标签: c# regex .net-4.5

我有一个包含嵌套属性的plist文件。我需要在打开后立即获取文本“(”,这是“名称”。我可以做得很好,但是,因为有嵌套属性,当我的C#逻辑迭代plist中的行时,名称得到被下一个属性覆盖。有没有办法只匹配一个确切的模式;特别是不匹配字符串的任何部分以“)”匹配

 : (MyNameHere                //Match
           : (propertyone)    // do not match, because it ends with ")" 

这是我用来匹配名称的正则表达式。

:\s\(([a-z,A-Z,0-9,-_]+)

我正在使用C#.net 4.5

由于

2 个答案:

答案 0 :(得分:3)

我不知道你究竟想做什么,但我怀疑平衡组会让你感兴趣:https://msdn.microsoft.com/en-us/library/bs2twtah%28v=vs.110%29.aspx

如果您想匹配一条不结束且不包含右括号的行,您可以使用以下模式:

(?>[^\n)]*)(?!\))

细节:

(?>...) # is an atomic group that prevents the regex engine to backtrack
(?!\))  # is a negative lookahead (not followed by ...) to check there
        # is not parenthesis after

重要的是,*(和所有其他量词一样)默认是贪婪的。

About atomic groups

如果您想允许包含右括号但不能以右括号结尾的行:

(?m)^.*(?<!\))$

答案 1 :(得分:1)

如果您不希望在[\w-]+后面有任何其他空格字符,则需要在最后添加正向前瞻断言。 (?=\s|$)肯定前瞻,断言匹配必须后跟空格字符或行锚点的结尾。

@":\s\(([\w-]+)(?=\s|$)"

必要时使用\s@":\s\(([\w-]+)$就足够了。

DEMO