Javascript Regex,group& ;;定量器
我只是在做了一个有趣的正则表达式纵横填字游戏,发现我不明白量化组的意思,例如(.)+或(.)* 让我试试,它提供了JavaScript和PHP正则表达式引擎: 要匹配的字符串是“Trololo!”(不带引号)。 (如果打开“全局匹配”更改了某些内容,则会将其添加为预处理版本,即JS’,因为它在PHP模式下没有更改任何内容。)Javascript Regex,group& ;;定量器,javascript,php,regex,regex-group,quantifiers,Javascript,Php,Regex,Regex Group,Quantifiers,我只是在做了一个有趣的正则表达式纵横填字游戏,发现我不明白量化组的意思,例如(.)+或(.)* 让我试试,它提供了JavaScript和PHP正则表达式引擎: 要匹配的字符串是“Trololo!”(不带引号)。 (如果打开“全局匹配”更改了某些内容,则会将其添加为预处理版本,即JS’,因为它在PHP模式下没有更改任何内容。) 是否有任何规范性的答案这是什么语义?输出没有正确标记,仅此而已 首先,应该发生什么?如果重复一个组,每个新实例将覆盖最后一个捕获。如果该组根本不被使用,它将返回一个空字符串
是否有任何规范性的答案这是什么语义?输出没有正确标记,仅此而已 首先,应该发生什么?如果重复一个组,每个新实例将覆盖最后一个捕获。如果该组根本不被使用,它将返回一个空字符串或类似于JS中的
undefined
(这取决于味道)。关于这件事有一篇好文章
现在我们如何得到你的结果?让我们从JavaScript开始
所有标有JS
(非全局)的示例都符合上述描述。它们匹配0
中所需的字符数,并捕获1
中的最后一个字符。所以我们可以忽略这些
全球的是什么?这里的输出被错误地解释了。将全局标志与String.match()
函数一起使用时,将不再获得所有捕获的数组,而只获得所有匹配的数组(每个匹配的组0
)。因此,对于只有一个匹配项的+
、*
和{5}
情况,您只能得到一个结果。使用{4}
时,目标字符串中有足够的空间容纳两个匹配项,因此生成的数组包含两个元素。要获取带有全局标志的所有捕获,您需要编写一个循环,并使用RegExp.exec()
(它一次提供一个匹配项,但不提供所有捕获项)
PHP有什么用?似乎它使用的是preg\u match\u all
,这是全局性的,这就是为什么使用g
没有效果的原因。+
再次给出您期望的结果。{5}
也是如此
另外两个怎么了?在这里,输出的解释是错误的。默认情况下,preg_match_all
提供一个二维数组,其中第一个索引对应于组,第二个索引对应于匹配。在您的输出中,它被反过来解释。因此,当存在多个匹配时,第一对0
和1
是两个找到的匹配的完整匹配。第二对0
和1
是您在这两个匹配中捕获的
因此,对于*
,首先获得完整字符串作为匹配,最后一个字符作为捕获(标记为0
)的两个字符,这是正确的。然后,由于*
允许零宽度匹配,因此在字符串末尾会得到另一个(空)匹配,同时还有一个空捕获。但是,我不确定为什么相应的JS'
示例不包含额外的空字符串,因为string.match
会做同样的事情
对于
{4}
,您只需获得两个匹配项(Trol
和olo!
),就像JavaScript中捕获的l
和一样分别是code>,这同样很好。什么是JS
和JS'
?有什么区别?我认为那个网站没有给你正确的群组。改用。>首先,应该发生什么?确切地说,这就是问题所在:-)我实际上预期,abcd上的匹配(。*)将得到0。(一)。a 2。b 3。C4。也就是说,我得到了更多的群体,因为量化者似乎量化了群体。但是再仔细想想,这似乎根本不可用,因为组引用是固定的。@Falko,唯一一个这样做的正则表达式风格是.NET。在这里,每个组都有一个组对象,其中包含一组捕获。啊,太酷了。但如前所述,我无法想象这在实践中会有什么帮助。@Falko说你有类似于…(13 | 52 | 78 | 33)
的东西,并且想要匹配所有数字,但可能有任意数量。另一种方法是两步匹配,首先匹配序列,然后拆分序列或其他内容。但在.NET中,您可以立即捕获所有这些数字。NET实际上更进一步,这些捕获保存在堆栈上,在匹配过程中可以再次弹出元素,这样就可以在正则表达式中进行计数:[请参阅balling groups](stackoverflow.com/questions/17003799/什么是正则表达式平衡组)
JS, (.)+ => 0: Trololo! 1: !
JS', (.)+ => 0: Trololo!
PHP, (.)+ => 0: Trololo! 0: !
JS, (.)* => 0: Trololo! 1: !
JS', (.)* => 0: Trololo!
PHP, (.)* => 0: Trololo! 1: 0: ! 1:
JS, (.){5} => 0: Trolo 1: o
JS', (.){5} => 0: Trolo
PHP, (.){5} => 0: Trolo 0: o
JS, (.){4} => 0: Trol 1: l
JS', (.){4} => 0: Trol 1: olo!
PHP, (.){4} => 0: Trol 1: olo! 0: l 1: !