正则表达式只匹配不以“)”结尾的字符串
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-]+)$
就足够了。
我不知道你到底想做什么,但我怀疑平衡组会让你感兴趣: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)^.*(?<!\))$
我有一个包含嵌套属性的 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-]+)$
就足够了。
我不知道你到底想做什么,但我怀疑平衡组会让你感兴趣: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)^.*(?<!\))$