Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/463.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript Regex,group& ;;定量器_Javascript_Php_Regex_Regex Group_Quantifiers - Fatal编程技术网

Javascript Regex,group& ;;定量器

Javascript Regex,group& ;;定量器,javascript,php,regex,regex-group,quantifiers,Javascript,Php,Regex,Regex Group,Quantifiers,我只是在做了一个有趣的正则表达式纵横填字游戏,发现我不明白量化组的意思,例如(.)+或(.)* 让我试试,它提供了JavaScript和PHP正则表达式引擎: 要匹配的字符串是“Trololo!”(不带引号)。 (如果打开“全局匹配”更改了某些内容,则会将其添加为预处理版本,即JS’,因为它在PHP模式下没有更改任何内容。) 是否有任何规范性的答案这是什么语义?输出没有正确标记,仅此而已 首先,应该发生什么?如果重复一个组,每个新实例将覆盖最后一个捕获。如果该组根本不被使用,它将返回一个空字符串

我只是在做了一个有趣的正则表达式纵横填字游戏,发现我不明白量化组的意思,例如(.)+或(.)*

让我试试,它提供了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
一样,这同样很好。

什么是
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: !