理解JavaScript中正则表达式背后的积极含义
Understanding positive look behind regex in JavaScript
我刚刚读到这个堆栈溢出问题,遇到了以下正则表达式:
(?<=:)(.*?)(?='/|$)
我想知道这段regex到底在做什么(?<=:)
。
如果我在regex101.com上检查regex,我会得到以下信息:
(?<=:(Positive Lookbacking-断言下面的正则表达式可以是match:匹配字符:字面意思。
现在我只是在学习regexs,我明白如果我有以下内容:
(?:car)
它基本上意味着一个非捕获组,但现在(?<=:
(是什么意思?这在什么方面有用?
更新:第一件事Lookbehinds在Javascript中不受支持
[2018年4月23日]Lookbehinds现在在Javascript中得到支持。请参阅提案here
。
lookbehinds的解释
我将用一个比喻来解释这一点。假设你站在某个面向前方的地方。现在你想看看你身后是什么。
那你是怎么做的
在不改变位置的情况下向后移动头部(可能是整个身体180度(,观察那里有什么。
这是有点类似于.的后备
您当前处于匹配的文本的某个位置(这就像面朝前(,您想看看后面是什么。
Lookbehing是零宽度,这意味着它不消耗任何类似于的字符串。您希望在不更改位置的情况下查看后面的内容
因此,使用正则表达式(?<=:)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
大多数编程语言的regex库都不支持可变/中项宽度的lookbacking,只有少数像python的.NET
、regex
库等。因此,使用(?<=:*)
等会出现错误。
Positive lookbehind
只有在positive lookbehind
组内的内容匹配时才会匹配。您是对的,在大多数情况下,使用non capturing group
的行为都是一样的。
但有一个区别:
/(?:foo)bar/
将捕获foobar
/(?<=foo)bar/
将仅捕获bar
(如果前面是foo
(
在Javascript中不支持Lookbacking。
基本上,lookbacking用于验证某个东西是否可以匹配,但它不会添加到最终结果中。因此,例如,如果你想匹配abc,用数字包围,但你只想要abc,并且你的regex风格支持查找,你可以写这样的东西:(?<=[0-9])(abc)(?=[0-9])
。这意味着:"我想要abc,但只有当它在数字后面和前面时。">
在您问题中的示例中,它的意思是:"匹配:
和/
之间的所有内容">
- 代码背后调用一个JavaScript函数的按钮点击-C#
- 如何从C#代码背后调用本地存储的javascript函数
- javascript在代码背后的语法
- 在jquery和javascript中创建自定义日历背后的逻辑
- Asp.net将代码背后的数据传递给Javascript并调用数组
- 如何通过 javascript 访问参数化函数背后的代码
- 从aspx中的代码背后调用JavaScript
- 掌握某个javascript功能背后的概念
- 从asp.net代码背后打开Javascript的ShowModalDialog
- 在 ASP.NET Web 窗体中从 javascript/客户端设置属性背后的代码
- 从 C# Web 应用程序背后的代码调用 JavaScript 函数
- 从 JavaScript 函数调用 C# 方法背后的代码时出错
- Javascript 函数不是从按钮单击背后的代码调用的
- 正则表达式,负面的 JavaScript 背后的外观
- AJAX:如何从 AJAX 方法背后的 C# 代码调用 javascript 函数
- JavaScript:“shift”方法背后的逻辑是什么?
- 从javascript调用c#函数背后的代码
- 将Javascript对象数组传递给C#代码背后
- 从asp.net代码背后的javascript警报中获取ok
- 将asp.net代码背后的数据发送到javascript函数