【问题标题】:Regex pattern matching正则表达式模式匹配
【发布时间】:2011-05-23 06:54:22
【问题描述】:

在正则表达式方面我完全是新手,我需要一种方法来匹配以下模式:

0hv05d_1a8198c8c430c2333fd6e49863f59f60_d41d8cd98f00b204e9800998ecf8427e_3600_3_25

解释:

有 6 个部分用下划线分隔。第一部分总是 6 个 [a-zA-Z0-9] 字符。第二和第三部分是 MD5 哈希,所以它们总是 32 [a-zA-Z0-9] 字符。最后 3 个部分只能是数字。

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

提前致谢。

【问题讨论】:

标签: php regex preg-match


【解决方案1】:

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

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

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

【讨论】:

    【解决方案2】:

    你可以试试:

    <?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 );
    }
    ?>
    

    【讨论】:

    • 效果很好,除非我在最后三个部分的数字之间添加字母,如果我不将值返回到 $match,它仍然会出现正数。无论哪种情况,这足以满足我的需要。谢谢!
    • @Vitality Isikov 这很奇怪。我无法解释。不客气!
    【解决方案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] 中指定 每个部分。

    【讨论】:

    • 我已经编辑了好几次,如果还是不行,用[0-9]替换\d(我现在正在编辑)
    • 我说你试图匹配的整个文本就是你所说的模式。如果您需要在较大的文本中匹配该模式,请删除模式开头的 ^ 和末尾的 $
    【解决方案4】:

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

    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
    }
    

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

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

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

    【讨论】:

      【解决方案5】:

      [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(Pearl 兼容正则表达式),您可以使用这个漂亮的备忘单:http://www.addedbytes.com/cheat-sheets/regular-expressions-cheat-sheet/

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2017-06-06
        • 2016-04-20
        • 2014-09-15
        • 2016-04-24
        • 2011-08-04
        相关资源
        最近更新 更多