我想仅将其作为第一组匹配 - > 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
答案 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----------^
$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