如何检查正则表达式是否恰好有两个捕获组


How to check if a regular expression have exactly two capturing groups?

我正在制作一段可重用的代码。可以指定用于捕获api_keysignature组的正则表达式,如以下Authorization标头所示:

AWS 44CF9590006BF252F707:jZNOcbfWmD/A/f3hSvVzXZjM2HU=

正则表达式为:

^AWS (?<api_key>.+):(?<signature>.+)$

当然,AWS 和密钥/签名对的顺序可能会改变(这就是我使用正则表达式的原因)。但是应该始终有一个api_key捕获组和一个signature捕获组。

如何使用另一个正则表达式检查这些组是否存在?

编辑:根据答案,我似乎根本不擅长解释这个问题。

用户(此代码的)将提供正则表达式(如上面的那个)。我只需要检查给定的正则表达式是否(至少)是两个捕获问题(api_keysignature)。然后,我将使用提供的正则表达式来测试Authorization标头。

但是你怎么知道你的新正则表达式正确测试了你的正则表达式呢?您可能需要 20-30 个级别的正则表达式:)。你试试一些简单的东西怎么样,比如:

if (strpos($yourRegEx, "(?<api_key>") !== false && strpos($yourRegEx, "(?<signature>") !== false) {

我想这是更万无一失的:

preg_match("'('?<api_key>.+?')", $yourRegEx) && preg_match("'('?<signature>.+?')", $yourRegEx)

为什么不像这样检查PHP:

preg_match('^AWS (?<api_key>.+):(?<signature>.+)$', $value, $matches);
assert(count($matches) === 3); // 0, 1 and 2.