【问题标题】:Regex match first word same as last word正则表达式匹配第一个单词与最后一个单词相同
【发布时间】:2013-09-15 17:56:58
【问题描述】:

这是正则表达式:

"'(\d{4})-(.*)-(\d{4})'i"

我想匹配数字 (\d{4}) 的第一部分,它必须与最后一部分相同

像这样:

  • 1111-abcdefg-2222 = 无效
  • 1111-x-1111 = 有效
  • 0000-rwrgreheherhe-0000 = 有效
  • 1234-abcd-5678 - 无效

我怎样才能做到这一点?

更新

我使用下面的脚本来检查输出

$i = '1111-abcd-1111';
preg_match("'(\d{4})-(.*)-(\1)'i",$i,$m);
echo print_r($m,true);

但返回空数组?

【问题讨论】:

    标签: php regex preg-match


    【解决方案1】:

    使用反向引用:

    '/(\d{4})-(.*)-\1/i'
    

    \1 等于您在第一个捕获组中捕获的内容。

    【讨论】:

      【解决方案2】:

      使用\1 作为第一个捕获组的反向引用:

      '~(\d{4})-(.*)-\1~'
      

      在此处查看实际操作:http://codepad.viper-7.com/2Jw0dL

      【讨论】:

      • 感谢您的快速回复,但似乎不起作用,我打印 $matches 数组但返回空
      • 很可能,我刚刚将 " 更改为 ' 并且它有效,非常感谢
      【解决方案3】:

      你需要使用反向引用:

      "'(\d{4})-(.*)-\1'i"
      

      【讨论】:

        【解决方案4】:
        preg_match("'(\d{4})-(.*)-(\g1)'i",$i,$m);
        

        将 \g1 添加到后面的引用中: http://php.net/manual/en/regexp.reference.back-references.php

        从 PHP 5.2.2 开始,\g 转义序列可用于子模式的绝对和相对引用。此转义序列必须后跟一个无符号数或负数,可选择用大括号括起来。序列 \1、\g1 和 \g{1} 是彼此同义的。将此模式与无符号数字一起使用有助于消除在反斜杠后面使用数字时固有的歧义。该序列有助于将反向引用与八进制字符区分开来,并且还可以更容易地在反向引用后跟一个文字数字,例如\g{2}1.

        【讨论】:

        • \\1 似乎也有效。我认为这是您使用双引号引起的问题。 preg_match('/(\d{4})-(.*)-(\1)/i',$i,$m);工作正常。
        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2015-09-08
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多