匹配前的第一个数字不是特定数字

时间:2015-02-10 14:53:10

标签: php regex

我匹配第一次出现的数字和特定字符串前的逗号。但是,我不想匹配某组数字。

让我们从一些例子开始

我不想匹配的数字:2013年,2014年,2015年

“这是2013年我要匹配的1个字符串。”

preg_match('/([\d,]+)\D*I want to match/', $str, $match);

需要匹配:1

“这是我要匹配的1个字符串”

preg_match('/([\d,]+)\D*I want to match/', $str, $match);

需要匹配:1

“这是2012年我要匹配的1个字符串”

preg_match('/([\d,]+)\D*I want to match/', $str, $match);

需要匹配:2012

我目前的正则表达式适用于示例1& 3,但我需要添加示例2的附加功能。

2 个答案:

答案 0 :(得分:1)

我建议你改变你的正则表达式。

([\d,]+)(?:(?:2013|2014|2015)|\D)*I want to match

从组索引1中获取所需的字符串。

DEMO

<强>解释

  • ([\d,]+)它会捕获一个或多个数字或逗号。
  • (?:(?:2013|2014|2015)|\D)*将字符串20132015匹配。它找到一个非数字字符,然后控件转移到OR部分旁边的模式,即\D匹配任何非数字字符)。整个群组使整个模式重复零次或多次后*

代码:

$str = <<<EOT
This is the 1 string in 2013 I want to match.
This is the 1 string I want to match
This is the 1 string in 2012 I want to match
EOT;
preg_match_all('~([\d,]+)(?:(?:2013|2014|2015)|\D)*I want to match~', $str, $match);
print_r($match[1]);

<强>输出:

Array
(
    [0] => 1
    [1] => 1
    [2] => 2012
)

答案 1 :(得分:0)

您可以使用此正则表达式

/(?:([\d,]+)\D*201[3-5]|([\d,]+))\D*I want to match/

Online demo

命令:

preg_match('/(?:([\d,]+)\D*201[3-5]|([\d,]+))\D*I want to match/', $str, $match);