何时在 Regex 中使用正面环视?
When to use positive lookarounds in Regex?
谁能给我解释一下,why/when 我应该在 Regex 中使用 positive lookarounds?对于负面环视,我可以想到它们是唯一解决方案的场景,但对于正面环视,我不明白为什么要使用它们,因为它们的结果也可以通过使用捕获组来产生。
例如:
输入:Bus: red, Car: blue
我要车的颜色
环顾四周:(?<=Car: )\w+
使用捕获组:Car: (\w+)
两个 Regex 存档相同的结果 - 直接访问颜色匹配。那么是否存在只能通过积极的环顾四周来解决的情况?
在不影响主模式的情况下对模式施加额外条件时,正环视可能很有用。
例如,您可能需要检查字符串是否包含红色公共汽车或蓝色汽车并且不超过 20 个字符:
^(?=.{0,20}$).*(?:Bus: red|Car: blue)
演示:https://regex101.com/r/iQ4uL4/1
可以在此处找到更多此类示例:
PCRE 不仅用于 PHP,该库还用于各种工具和语言,您并不总是能够轻松访问捕获的组。
在其中一些中,lookbehind 是最简单的方法,比如说,拆分字符串(在 R 中使用 strsplit
),或者解决访问子匹配的问题。
PCRE lookbehind 在某种程度上是 "crippled",也就是说,它是固定宽度的,因此实际上并不是那么成熟。然而,这里是an interesting case:在匹配提高性能后使用正后视:\d{3}(?<=USD\d{3})
。这里,匹配到3个数字后才开始校验,不需要校验U
,然后是S
,然后是D
,然后是digits.
关于正向前瞻,很多场景都会用到:
- 在匹配的字符串上设置条件(参见 Dmitry 的回答,例如
^(?=.*\d)
将要求字符串中至少有 1 个数字)
- 重叠匹配是可能的(例如
-\d+(?=-|$)
会在-1-2-3
中找到3个匹配)
谁能给我解释一下,why/when 我应该在 Regex 中使用 positive lookarounds?对于负面环视,我可以想到它们是唯一解决方案的场景,但对于正面环视,我不明白为什么要使用它们,因为它们的结果也可以通过使用捕获组来产生。
例如:
输入:Bus: red, Car: blue
我要车的颜色
环顾四周:(?<=Car: )\w+
使用捕获组:Car: (\w+)
两个 Regex 存档相同的结果 - 直接访问颜色匹配。那么是否存在只能通过积极的环顾四周来解决的情况?
在不影响主模式的情况下对模式施加额外条件时,正环视可能很有用。
例如,您可能需要检查字符串是否包含红色公共汽车或蓝色汽车并且不超过 20 个字符:
^(?=.{0,20}$).*(?:Bus: red|Car: blue)
演示:https://regex101.com/r/iQ4uL4/1
可以在此处找到更多此类示例:
PCRE 不仅用于 PHP,该库还用于各种工具和语言,您并不总是能够轻松访问捕获的组。
在其中一些中,lookbehind 是最简单的方法,比如说,拆分字符串(在 R 中使用 strsplit
),或者解决访问子匹配的问题。
PCRE lookbehind 在某种程度上是 "crippled",也就是说,它是固定宽度的,因此实际上并不是那么成熟。然而,这里是an interesting case:在匹配提高性能后使用正后视:\d{3}(?<=USD\d{3})
。这里,匹配到3个数字后才开始校验,不需要校验U
,然后是S
,然后是D
,然后是digits.
关于正向前瞻,很多场景都会用到:
- 在匹配的字符串上设置条件(参见 Dmitry 的回答,例如
^(?=.*\d)
将要求字符串中至少有 1 个数字) - 重叠匹配是可能的(例如
-\d+(?=-|$)
会在-1-2-3
中找到3个匹配)