正则表达式模式匹配

时间:2011-05-23 06:54:22

标签: php regex preg-match

对于正则表达式而言,我是一个完整的新手,我需要一种方法来匹配以下模式:

0hv05d_1a8198c8c430c2333fd6e49863f59f60_d41d8cd98f00b204e9800998ecf8427e_3600_3_25

说明:

有6个部分用下划线分隔。第一部分总是6个[a-zA-Z0-9]字符。第二和第三部分是MD5哈希值,因此每个部分始终为32 [a-zA-Z0-9]个字符。最后3个部分只能是数字。

我正在使用PHP preg_match来执行此操作。

提前致谢。

5 个答案:

答案 0 :(得分:8)

根据你的(有些不完整的)规范,这是我能做到的最短的时间:

preg_match('/[a-z\d]{6}(?:_[a-f\d]{32}){2}(?:_\d+){3}/i', $string);

这将恰好匹配一个字母或数字的六个实例;后跟一个下划线和32个十六进制数字,两次;后跟一个下划线和任意数字的数字,3次。最后的/i将其置于不区分大小写的模式中。

答案 1 :(得分:4)

你可以尝试:

<?php
$string = '0hv05d_1a8198c8c430c2333fd6e49863f59f60_d41d8cd98f00b204e9800998ecf8427e_3600_3_25';
if (preg_match('/([a-zA-Z0-9]{6})_([a-fA-F0-9]{32})_([a-fA-F0-9]{32})_([0-9]+)_([0-9]+)_([0-9]+)/',$string,$match)) {
    print_r( $match );
}
?>

答案 2 :(得分:3)

$string = "0hv05d_1a8198c8c430c2333fd6e49863f59f60_d41d8cd98f00b204e9800998ecf8427e_3600_3_25";
if (preg_match('/^([a-z0-9]{6})_([a-f0-9]{32})_([a-f0-9]{32})_([0-9]+)_([0-9]+)_([0-9]+)$/i', $string, $matches))
{
    echo "Match!<br />\n";
    echo "First: ".$matches[1]."<br />\n";
    echo "MD5 hashes: ".$matches[2]. " - ".$matches[3]."<br />\n";
    echo "numbers: ".$matches[4]. " - ".$matches[5]. " - ".$matches[6]."<br />\n";
}

备注:

  • md5只是[a-f0-9],而不是[a-z0-9]。
  • 我把/ i放到不区分大小写的匹配项中, 而不是指定[a-zA-Z] 各个部分。

答案 3 :(得分:1)

编辑 - 为了更完整,你可以这样做:

if (preg_match('/[a-z0-9]{6}_[a-f0-9]{32}_[a-f0-9]{32}_\d+_\d+_\d+/i', $subject)) {
    # Successful match
} else {
    # Match attempt failed
}

我还要用\ d类更简洁地替换[0-9],将MD5的匹配改为[a-f0-9],我也改变了[a-zA-Z0-9]至[a-z0-9]并包含/i,用于区分大小写。

如果你真的想表达,也可以改写为:

/[a-z0-9]{6}(?:_[a-f0-9]{32}){2}(?:_\d+){3}/i

答案 4 :(得分:0)

[a-zA-Z0-9]{6}_[a-f0-9]{32}_[a-f0-9]{32}_[0-9]+_[0-9]+_[0-9]+

参考:http://www.php.net/manual/en/reference.pcre.pattern.syntax.php

另外,因为php使用PCRE(珍珠兼容正则表达式),你可以使用这个漂亮的备忘单:http://www.addedbytes.com/cheat-sheets/regular-expressions-cheat-sheet/