匹配分隔符之间的选择文本

时间:2013-11-02 21:40:48

标签: php regex

出于某种原因,我的正则表达式与我追求的和额外的相匹配。我需要匹配group #,但它也匹配第一个电话号码。

示例数据:

id: N group: 1 category: NAMES : Mike
id: N group: 2 category: NAMES : Seth
id: # group: 1 category: PHONE : 123-456-789
id: # group: 2 category: PHONE : 111 111-1111
id: @ group: 1 category: EMAIL : mike@mail.com
id: @ group: 2 category: EMAIL : seth@yahoo.com

正则表达式

preg_match_all('/:\s+\d/', $data, $matches);

当前输出

1
2
1
1
2
1
1
2

预期输出

1
2
1
2
1
2

3 个答案:

答案 0 :(得分:3)

通过

更改正则表达式
"/group:\s*(\d+)/i"

问题是您在PHONE和EMAIL之后还有“:”

答案 1 :(得分:1)

你可以做一个预测,以确保category立即跟随:

preg_match_all('/:\s+\d(?= category)/', $data, $matches);

没有捕捉前瞻,但如果不存在则字符串不会匹配。

答案 2 :(得分:1)

您可以使用以下内容,排除空白并为您提供完全匹配。

preg_match_all('/(?<![^ ])\d(?!\d)/', $data, $matches);

请参阅live demo

或者为了安全起见,你可以先用一下。

preg_match_all('/\d(?= +category)/i', $data, $matches);

请参阅live demo

更好的是,只需匹配group:和以下数字。

preg_match_all('/group:\s+\K\d/i', $data, $matches);