它们被称为环视;它们允许您断言模式是否匹配,而无需实际匹配。有 4 种基本外观:
- 积极的环顾四周:看看我们是否可以匹配
pattern
...
(?=pattern)
- ...当前位置右侧(向前看)
(?<=pattern)
- ...在当前位置的左侧(向后看)
- 负面的环视 - 看看我们是否无法匹配
pattern
(?!pattern)
- ...向右
(?<!pattern)
- ...向左
作为一个简单的提醒,环顾四周:
参考
但是为什么要使用环视呢?
有人可能会争辩说,上述模式中的环视不是必需的,并且#([^#]+)#
可以很好地完成工作(提取由捕获的字符串\1
以获取非#
- )。
不完全的。不同之处在于,由于环视与 不匹配,#
因此下次尝试查找匹配时可以再次“使用”它。简单地说,环视允许“匹配”重叠。
考虑以下输入字符串:
and #one# and #two# and #three#four#
现在,#([a-z]+)#
将给出以下匹配项(如 rubular.com 上所见):
and #one# and #two# and #three#four#
\___/ \___/ \_____/
将此与(?<=#)[a-z]+(?=#)
匹配的 进行比较:
and #one# and #two# and #three#four#
\_/ \_/ \___/ \__/
不幸的是,这无法在 rubular.com 上演示,因为它不支持后视。但是,它确实支持前瞻,所以我们可以用 , 做类似的事情#([a-z]+)(?=#)
(如在 rubular.com 上看到的):
and #one# and #two# and #three#four#
\__/ \__/ \____/\___/
参考