我有一个包含嵌套属性的plist文件。我需要在打开后立即获取文本“(”,这是“名称”。我可以做得很好,但是,因为有嵌套属性,当我的C#逻辑迭代plist中的行时,名称得到被下一个属性覆盖。有没有办法只匹配一个确切的模式;特别是不匹配字符串的任何部分以“)”匹配
: (MyNameHere //Match
: (propertyone) // do not match, because it ends with ")"
这是我用来匹配名称的正则表达式。
:\s\(([a-z,A-Z,0-9,-_]+)
我正在使用C#.net 4.5
由于
答案 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
重要的是,*
(和所有其他量词一样)默认是贪婪的。
如果您想允许包含右括号但不能以右括号结尾的行:
(?m)^.*(?<!\))$
答案 1 :(得分:1)
如果您不希望在[\w-]+
后面有任何其他空格字符,则需要在最后添加正向前瞻断言。 (?=\s|$)
肯定前瞻,断言匹配必须后跟空格字符或行锚点的结尾。
@":\s\(([\w-]+)(?=\s|$)"
必要时使用\s
或@":\s\(([\w-]+)$
就足够了。