我匹配第一次出现的数字和特定字符串前的逗号。但是,我不想匹配某组数字。
让我们从一些例子开始
我不想匹配的数字: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的附加功能。
答案 0 :(得分:1)
我建议你改变你的正则表达式。
([\d,]+)(?:(?:2013|2014|2015)|\D)*I want to match
从组索引1中获取所需的字符串。
<强>解释强>
([\d,]+)
它会捕获一个或多个数字或逗号。(?:(?:2013|2014|2015)|\D)*
将字符串2013
与2015
匹配。它找到一个非数字字符,然后控件转移到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/
命令:
preg_match('/(?:([\d,]+)\D*201[3-5]|([\d,]+))\D*I want to match/', $str, $match);