Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/regex/16.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
Regex 正则表达式中的前瞻性总是不捕获还是依赖于它?_Regex - Fatal编程技术网

Regex 正则表达式中的前瞻性总是不捕获还是依赖于它?

Regex 正则表达式中的前瞻性总是不捕获还是依赖于它?,regex,Regex,我在这个网站和网上读了一些关于非捕获组的文章 (如和) 我很清楚(?:foo)的含义。我不清楚的是(?=foo)。(=foo)也始终是一个非捕获组,还是取决于它?环顾四周总是非捕获且宽度为零。每个以?开头的组都将是非捕获组,尽管只有(?:foo)作为常规组工作。否,(?=foo)将不会捕获“foo”。任何环视断言(消极和积极的向前和向后环视)都不会捕获,而只会检查文本的存在(或不存在) 例如,正则表达式: (X(?=\d+)) (X(?=(\d+))) 仅当后面有一个或多个数字时,才匹配“X

我在这个网站和网上读了一些关于非捕获组的文章 (如和)


我很清楚(?:foo)的含义。我不清楚的是(?=foo)。(=foo)也始终是一个非捕获组,还是取决于它?

环顾四周总是非捕获且宽度为零。

每个以
开头的组都将是非捕获组,尽管只有
(?:foo)
作为常规组工作。

否,
(?=foo)
将不会捕获
“foo”
。任何环视断言(消极和积极的向前和向后环视)都不会捕获,而只会检查文本的存在(或不存在)

例如,正则表达式:

(X(?=\d+))
(X(?=(\d+)))
仅当后面有一个或多个数字时,才匹配“X”。但是,这些数字不属于匹配组1的一部分

您可以在“前瞻”中定义捕获以捕获它。例如,正则表达式:

(X(?=\d+))
(X(?=(\d+)))
仅当后面有一个或多个数字时,才匹配“X”。这些数字被记录在比赛组2中

PHP演示:


将打印:

Array ( [0] => Array ( [0] => X ) [1] => Array ( [0] => X ) [2] => Array ( [0] => 123 ) ) 排列 ( [0]=>阵列 ( [0]=>X ) [1] =>阵列 ( [0]=>X ) [2] =>阵列 ( [0] => 123 )
)+谢谢你。零宽度是一个让我困惑的术语。它是否表示它不使用任何字符。引用自:“向前看或向后看不会“消耗”字符串上的任何字符。这意味着在查找之后,正则表达式引擎将回到它开始查找的字符串上的同一位置。”;同样,
\b
被称为零宽度字符。我找不到一个来源明确地说,看不见的猎物,但考虑相反:如果猎物是可捕捉的,那么什么样的句法会使它无法捕捉?(没有像
(?:?=…)
)这样的语法)如果不能强制一个lookaround是不可捕获的,那么许多使用lookarounds的正则表达式就会中断,因为捕获偏移量会随着每个lookarounds而移动。我相信这是足够的证据表明,没有引擎会在默认情况下捕获周围环境。+1谢谢。如果我理解你的例子,它是一种有条件的,例如,正则表达式(X(?=\d+)翻译成英语意味着“如果X后面跟一个数字,则匹配X”,这是你通常使用的
(foo)
。例如,您可以添加量词来重复它。我不确定环顾一下这是否有意义(
(?(?I)
,…),等等。