Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/multithreading/4.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
Php 从条件正则表达式获取捕获组_Php_Javascript_Regex - Fatal编程技术网

Php 从条件正则表达式获取捕获组

Php 从条件正则表达式获取捕获组,php,javascript,regex,Php,Javascript,Regex,我想写一个条件正则表达式,它匹配2种模式中的1种 为此,我有一个简单的条件: /((模式1)|(模式2))/gi 问题是,在pattern1中,我可能有多个捕获组——比如说3个,但在pattern2中,我有5个 我如何分辨这两种模式中的哪一种匹配?我需要能够为输出请求正确的捕获组(按编号) 我猜在我的示例中,您可以检查是否存在任何大于3的捕获组值,但假设每个模式中的捕获组数量相等。我想一定有一个很好的方法可以做到这一点——我正在使用PHP或JavaScript。如果需要更多细节,请告诉我 提前谢

我想写一个条件正则表达式,它匹配2种模式中的1种

为此,我有一个简单的条件:

/((模式1)|(模式2))/gi

问题是,在pattern1中,我可能有多个捕获组——比如说3个,但在pattern2中,我有5个


我如何分辨这两种模式中的哪一种匹配?我需要能够为输出请求正确的捕获组(按编号)

我猜在我的示例中,您可以检查是否存在任何大于3的捕获组值,但假设每个模式中的捕获组数量相等。我想一定有一个很好的方法可以做到这一点——我正在使用PHP或JavaScript。如果需要更多细节,请告诉我


提前谢谢

模式的编号基于正则表达式本身,而不是实际匹配的结果。在您的示例中,整个组始终为组1,然后第一种可能性(“模式1”)为组2,另一种可能性为组3。如果“pattern2”匹配,那么组3将是非空的,组2将是空的,换句话说。组1将始终与组2和组3中的非空组相同。

(模式1)
如果匹配,则匹配[1]将匹配[1],如果不匹配,则匹配[1]将
未定义<代码>(模式2)
将与[2]匹配(如果存在),而
未定义(如果没有)

匹配数组是从正则表达式本身定义的,与实际匹配的内容无关。未匹配的内容将在数组中未定义

在此代码中:

var re = /(patt)(ern1)|(pat)(tern2)/i;
var str = "this is pattern1 and some more text";

var matches = str.match(re);
您将得到一个包含五个条目的匹配数组

matches[0] === "pattern1"
matches[1] === "patt"
matches[2] === "ern1"
matches[3] === undefined
matches[4] === undefined
matches.length === 5

请注意,只有在删除匹配模式中的外部捕获参数和“g”标志时,此选项才有效。

我建议您通过以下方式尝试在Firefox中的firebug等控制台中查找您想要的内容:

'mystring'.replace(/myregex/gi, function () {
    console.info(arguments);
});
像这样,你可以做一些尝试和错误,看看正则表达式是如何工作的。但请注意:RegExp并不是在所有情况下都使用相同的跨浏览器。

我如何判断这两种模式中的哪一种匹配?我需要能够为输出请求正确的捕获组(按编号)。”

如果您对每个模式中的分组一无所知

(?|(模式1)|(模式2))

允许您在组1开始索引。

但哪种模式的意义仍然是个谜。最好在那一点之后检查内容。

为什么不使用两个regex=d这不是一个条件,而是一个替代。啊,你是说理论上,pattern1总是包含捕获组2、3和4,而pattern2总是包含组5、6和7,这只是基于我编写regex的方式??是的。我一直在做的就是根据正则表达式中左paren的位置来计算组。(我不是100%确定这是严格正确的,但我没有编写太多超复杂的正则表达式。)所以最左边的组(“是组1,然后是下一个”)是第二组,依此类推。是的,这就是规则:期初参数的相对位置决定了组号。但是,在某些情况下,可以覆盖该行为,例如使用的分支重置组。