更新:第一件事。 Javascript 不支持 Lookbehinds。
[2018 年 4 月 23 日] Javascript 现在支持 Lookbehinds。见提案here。
解释说明
我将给出一个类比来解释这一点。假设你站在某个面向正面的地方。现在你想看看你身后是什么。
那你是做什么的?
你将你的头(可能是整个身体 180 度)向后移动不改变你的位置并观察那里有什么。
这有点类似于。
您当前位于要匹配的文本的某个位置(这就像面向前方)并且您想查看后面的内容。
Lookbehind 是零宽度意味着它不会消耗任何类似于 您想在不改变位置的情况下查看后面的内容
的字符串
所以使用正则表达式(?<=:)abc,您基本上是在尝试找到abc 的所有位置,其中: 就在abc 之前。
请记住,: 只是被检查过并且没有存储在任何地方,因为 look(aheads|behinds) 的 zero-width 断言属性
注意
这只是一个松散耦合的类比,以便更好地理解和可视化。实际上,在每个位置,: 的存在都会被向后检查,例如字符串 ab:abc(为了清楚起见,下面的空格)
a b : a b c
^
When this is the position of checking, a is matched with :
a b : a b c
^
When this is the position of checking, b is matched with :
a b : a b c
^
When this is the position of checking, : is matched with :
As they match, now abc of regex is matched against string abc.
If successful match is found.
注意 1
大多数编程语言的正则表达式库不支持可变/无限宽度lookbehind除了少数像.NET,regex python库等。所以使用(?<=:*)等会出错。