正则表达式帮助:匹配所有匹配项并格式化字符串

时间:2016-01-12 08:45:53

标签: php regex

我想仅将其作为第一组匹配 - > e6 c4 aa 7a 7d 11 3d c2 6c cb 6e 3f b5 bc 61 27 e8 67 2c f7

我试过了folwonig reg-ex:\s+Cert Hash.*(\s[a-z0-9]{2})+ 但它只匹配 f7 作为第一组

我正在应用reg-ex的字符串是:

    [staf]  NotBefore: 1/11/2016 9:48 AM
     [staf]  NotAfter: 1/11/2024 9:48 AM
     [staf] Subject: CN=My Root CA, O=Experian, OU=Hunter, L=Sofia, S=CA, C=BG
     [staf] Signature matches Public Key
     [staf] Root Certificate: Subject matches Issuer
     [staf] Template:
     [staf] Cert Hash(sha1): e6 c4 aa 7a 7d 11 3d c2 6c cb 6e 3f b5 bc 61 27 e8
67 2c f7
     [staf]   Key Container = 9c4336e8-9450-46b8-9bdc-cf70faafb29a
     [staf]   Unique container name: 2d800c871d70eba035d4612cdd5d1a61_48982b62-3

如果我能摆脱空间并仅仅得到结果,那将是很棒的: e6c4aa7a7d113dc26ccb6e3fb5bc6127e8672cf7

2 个答案:

答案 0 :(得分:1)

这是因为Kleene明星运营商的贪婪:

\s+Cert Hash.*(\s[a-z0-9]{2})+
             ^greedy

你可以通过简单地使它变得非贪婪来捕获所有项目:

\s+Cert Hash.*?(\s[a-z0-9]{2})+

此外,为了捕获它,您需要在要捕获的部分周围放置括号:

\s+Cert Hash.*?((\s[a-z0-9]{2})+)

(包括+量词)。

regex101现在似乎捕获了正确的组。

答案 1 :(得分:1)

我倾向于避免使用延迟/贪婪点匹配,因为它经常会导致不必要的行为。在您的情况下,.*Cert Hash之后的所有其余行匹配。我建议将其转换为与[^:]*以外的零个或多个字符匹配的否定字符类: ^ 1 ^ ),然后将(\s[a-z0-9]{2})+子模式括起来捕获组( ^ 2 ^ )(建议将非捕获组与(\s[a-z0-9]{2})+一起使用,因为我们只需要在此处进行分组,而不是子匹配。)

因此,请使用following regex

\s+Cert Hash[^:]*:\s*((?:\s*[a-z0-9]{2})+)
            ^^1^^    ^--------2----------^

PHP code

$re = '~\s+Cert Hash[^:]*:\s*((?:\s*[a-z0-9]{2})+)~'; 
$str = " [staf]  NotBefore: 1/11/2016 9:48 AM\n     [staf]  NotAfter: 1/11/2024 9:48 AM\n     [staf] Subject: CN=My Root CA, O=Experian, OU=Hunter, L=Sofia, S=CA, C=BG\n     [staf] Signature matches Public Key\n     [staf] Root Certificate: Subject matches Issuer\n     [staf] Template:\n     [staf] Cert Hash(sha1): e6 c4 aa 7a 7d 11 3d c2 6c cb 6e 3f b5 bc 61 27 e8\n67 2c f7\n     [staf]   Key Container = 9c4336e8-9450-46b8-9bdc-cf70faafb29a\n     [staf]   Unique container name: 2d800c871d70eba035d4612cdd5d1a61_48982b62-3"; 
preg_match($re, $str, $match);
echo preg_replace('~\s*~', '', $match[1]);
// => e6c4aa7a7d113dc26ccb6e3fb5bc6127e8672cf7