使用负前瞻的正则表达式缺少 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+ 次
  • )" 关闭群组并匹配 "

Regex demo


或者如果你想包括否定的前瞻:

"user\.ldap\.groups\.name"\s*=\s*"([^"]+)"(?!"user\.ldap\.groups\.name")

Regex demo