正则表达式查找特定长度的数字,但除了之前或之后的数字之外的任何字符

时间:2012-02-09 21:19:52

标签: php regex preg-match

我正在尝试制作一个正则表达式模式来搜索一个12位数的字符串。该号码可以在我正在寻找的号码前面或后面有任意数量的其他字符(但不是数字)。

到目前为止,我有/([0-9]{12})/正确找到12位数字,但它也会匹配字符串中的13位数字。

模式应与以下字符串上的123456789012匹配

  • “rgergiu123456789012ergewrg”
  • “123456789012”
  • “#123456789012”
  • “ergerg ergerwg erwgewrg \ n rgergewrgrewg regewrge 123456789012 ergwerg”

它应该匹配这些字符串上的任何内容:

  • “123456789012000”
  • “egjkrgkergr 123123456789012”

2 个答案:

答案 0 :(得分:2)

你想要的是环顾四周。类似的东西:

/(?<![0-9])[0-9]{12}(?![0-9])/

如果模式前面或后面跟着另一个模式,前瞻或后视匹配,而不消耗该模式。因此,如果这些模式之前或之后没有更多数字,则它将匹配12位数字,而不会消耗数字前后的字符。

答案 1 :(得分:2)

/\D(\d{12})\D/(在这种情况下,数字将是捕获索引1)

编辑:哎呀,如果数字是整个字符串那么一个不起作用。请改用下面的

或者,使用负面的后视和前瞻:/(?<!\d)\d{12}(?!\d)/(其中数字将是捕获索引0)


if( preg_match("/(?<!\d)\d{12}(?!\d)/", $string, $matches) ) {
    $number = $matches[0];
    # ....
}

其中$string是您正在测试的文字