正则表达式只匹配不以“)”结尾的字符串

Regex to only match a string that does not end with ")"

我有一个包含嵌套属性的 plist 文件。我需要在打开的“(”之后立即获取文本,这是 "Name"。我可以做到这一点,但是,因为存在嵌套属性,当我的 C# 逻辑遍历 plist 中的行时, name 被下一个 属性 覆盖。有没有办法只匹配一个精确的模式;特别是不匹配以“)”结尾的字符串的任何部分

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

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

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

我正在使用 C#.net 4.5

谢谢

如果您不想在 [\w-]+ 之后添加任何其他 space 字符,则需要在最后添加一个肯定的先行断言。 (?=\s|$) 正先行断言匹配后必须跟一个 space 字符或行尾锚点。

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

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

DEMO

我不知道你到底想做什么,但我怀疑平衡组会让你感兴趣: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)^.*(?<!\))$