将多个环顾正则表达式与捕获组相结合
Combining multiple look around regex with a capturing group
给定一个像
这样的字符串
@1=a@2=b@3=c@4=d >> @1=a@2=b@3=c1@4=d
我想捕获@3 和@4 之间的内容,然后断言字符串的第二部分中的值(在本例中为c)不相同。
为此,我想到了
@3=((?:\w|-|'|"|,|\.)+?)@4=d.+(?<=@3\=)(?!)(?=@4\=d)
这捕获了 @3=((?:\w|-|'|"|,|\.)+?)@4=d
"c" 但正则表达式的下一部分 ((?<=@3\=)(?!)(?=@4\=d)
) 没有按预期工作。我希望 (?<=@3\=)
这会断言“@3=” (?!)
会说断言 NOT first captured group
而 (?=@4\=d)
会断言 @4=。
如果您能帮助解释为什么这不起作用,我们将不胜感激。
为什么你的模式不起作用?它最后包含 3 个 lookarounds:(?<=@3\=)(?!)(?=@4\=d)
。 Lookarounds 是零宽度断言,一个接一个地执行,正则表达式索引保持在与以前相同的位置。也就是说,(?<=@3\=)(?!)(?=@4\=d)
匹配紧跟在 @3=
之前的位置 和紧跟在 @4=
之后的 而 @4=
不能以组 1 中的值。它与分隔符之间的新值不匹配,最终没有多大意义。
您可以使用以下模式:
@3=([\w'",.-]*)@4=d.*?>>.*?@3=(?!@)[\w'",.-]*@4=d
见regex demo。当用于 @1=a@2=b@3=c@4=d >> @1=a@2=b@3=c1@4=d
字符串时,正则表达式匹配并捕获 c
,因为它不等于与第二个 [\w'",.-]*
.
匹配的 c1
子字符串
详情
@3=
- @3=
子串
([\w'",.-]*)
- 第 1 组:零个或多个字母、数字、_
、'
、"
、,
、.
或 -
@4=d
- 文字 @4=d
子串
.*?
- 除换行字符外的任何 0+ 个字符尽可能少
>>
- >>
子串
.*?
- 除换行字符外的任何 0+ 个字符尽可能少
@3=
- @3=
子串
(?!@)
- 如果当前位置右侧的文本等于第 1 组中捕获的文本并且后跟 @
[=72,则匹配失败的否定前瞻=]
[\w'",.-]*
- 零个或多个字母、数字、_
、'
、"
、,
、.
或 -
@4=d
- 文字 @4=d
子串
试试这个模式:(?<=@3=)(\w++).+>>.+(?<=@3=)(?(1)(?!@4)\w++|\w++)
.
给定一个像
这样的字符串@1=a@2=b@3=c@4=d >> @1=a@2=b@3=c1@4=d
我想捕获@3 和@4 之间的内容,然后断言字符串的第二部分中的值(在本例中为c)不相同。
为此,我想到了
@3=((?:\w|-|'|"|,|\.)+?)@4=d.+(?<=@3\=)(?!)(?=@4\=d)
这捕获了 @3=((?:\w|-|'|"|,|\.)+?)@4=d
"c" 但正则表达式的下一部分 ((?<=@3\=)(?!)(?=@4\=d)
) 没有按预期工作。我希望 (?<=@3\=)
这会断言“@3=” (?!)
会说断言 NOT first captured group
而 (?=@4\=d)
会断言 @4=。
如果您能帮助解释为什么这不起作用,我们将不胜感激。
为什么你的模式不起作用?它最后包含 3 个 lookarounds:(?<=@3\=)(?!)(?=@4\=d)
。 Lookarounds 是零宽度断言,一个接一个地执行,正则表达式索引保持在与以前相同的位置。也就是说,(?<=@3\=)(?!)(?=@4\=d)
匹配紧跟在 @3=
之前的位置 和紧跟在 @4=
之后的 而 @4=
不能以组 1 中的值。它与分隔符之间的新值不匹配,最终没有多大意义。
您可以使用以下模式:
@3=([\w'",.-]*)@4=d.*?>>.*?@3=(?!@)[\w'",.-]*@4=d
见regex demo。当用于 @1=a@2=b@3=c@4=d >> @1=a@2=b@3=c1@4=d
字符串时,正则表达式匹配并捕获 c
,因为它不等于与第二个 [\w'",.-]*
.
c1
子字符串
详情
@3=
-@3=
子串([\w'",.-]*)
- 第 1 组:零个或多个字母、数字、_
、'
、"
、,
、.
或-
@4=d
- 文字@4=d
子串.*?
- 除换行字符外的任何 0+ 个字符尽可能少>>
->>
子串.*?
- 除换行字符外的任何 0+ 个字符尽可能少@3=
-@3=
子串(?!@)
- 如果当前位置右侧的文本等于第 1 组中捕获的文本并且后跟@
[=72,则匹配失败的否定前瞻=][\w'",.-]*
- 零个或多个字母、数字、_
、'
、"
、,
、.
或-
@4=d
- 文字@4=d
子串
试试这个模式:(?<=@3=)(\w++).+>>.+(?<=@3=)(?(1)(?!@4)\w++|\w++)
.