使用负前瞻的正则表达式缺少 group2 的第一个字符
Regex using negative lookahead missing first character of group2
我需要从此示例字符串中获取 LDAP 组名称:
"user.ldap.groups.name" = "M-Role13" AND ("user.ldap.groups.name"= "M Role1" OR "user.ldap.groups.name" = "M.Group-Role16" OR "user.ldap.groups.name"="Admin Role" ) AND "common.platform" = "iOS" AND ( AND "ios.PersonalHotspotEnabled" = true ) AND "common.retired" = False
我正在使用此正则表达式来匹配包含 LDAP 组的字符串部分
("user\.ldap\.groups\.name"?.=.?".+?(.*?)")(?!"user\.ldap\.groups\.name")
但它在 group2 中匹配没有第一个字符的名称。
https://regex101.com/r/2Aby6K/1
关于您尝试的模式的一些注意事项
- 它错过第一个字符的原因是因为这部分
.+?
至少需要一个字符
- 请注意,在这部分
"?.=.?"
它匹配一个可选的 "
,由于第二个点是可选的点的任何字符之间的等号然后 "
- 这部分
(.*?)")(?!"user\.ldap\.groups\.name")
使用了一个非贪心的点.*?
,会尽可能的放弃满足条件去匹配一个"
后面没有直接跟user.ldap.groups.name
。查看 an example 的不正确匹配项。
您可能会使用 negated character class
"user\.ldap\.groups\.name"\s*=\s*"([^"]+)"
部分
"user\.ldap\.groups\.name"
匹配
\s*=\s*
在左边和右边的 0+ 个空白字符之间匹配 =
"(
匹配 "
并开始捕获组
[^"]+
匹配除 "
之外的任何字符 1+ 次
)"
关闭群组并匹配 "
或者如果你想包括否定的前瞻:
"user\.ldap\.groups\.name"\s*=\s*"([^"]+)"(?!"user\.ldap\.groups\.name")
我需要从此示例字符串中获取 LDAP 组名称:
"user.ldap.groups.name" = "M-Role13" AND ("user.ldap.groups.name"= "M Role1" OR "user.ldap.groups.name" = "M.Group-Role16" OR "user.ldap.groups.name"="Admin Role" ) AND "common.platform" = "iOS" AND ( AND "ios.PersonalHotspotEnabled" = true ) AND "common.retired" = False
我正在使用此正则表达式来匹配包含 LDAP 组的字符串部分
("user\.ldap\.groups\.name"?.=.?".+?(.*?)")(?!"user\.ldap\.groups\.name")
但它在 group2 中匹配没有第一个字符的名称。 https://regex101.com/r/2Aby6K/1
关于您尝试的模式的一些注意事项
- 它错过第一个字符的原因是因为这部分
.+?
至少需要一个字符 - 请注意,在这部分
"?.=.?"
它匹配一个可选的"
,由于第二个点是可选的点的任何字符之间的等号然后"
- 这部分
(.*?)")(?!"user\.ldap\.groups\.name")
使用了一个非贪心的点.*?
,会尽可能的放弃满足条件去匹配一个"
后面没有直接跟user.ldap.groups.name
。查看 an example 的不正确匹配项。
您可能会使用 negated character class
"user\.ldap\.groups\.name"\s*=\s*"([^"]+)"
部分
"user\.ldap\.groups\.name"
匹配\s*=\s*
在左边和右边的 0+ 个空白字符之间匹配=
"(
匹配"
并开始捕获组[^"]+
匹配除"
之外的任何字符 1+ 次
)"
关闭群组并匹配"
或者如果你想包括否定的前瞻:
"user\.ldap\.groups\.name"\s*=\s*"([^"]+)"(?!"user\.ldap\.groups\.name")