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


Match select text between delimiter

出于某种原因,我的正则表达式与我所追求的和额外的相匹配。我只需要匹配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

通过以下方式更改正则表达式

"/group:'s*('d+)/i"

问题是您在电话和电子邮件之后还有":"

您可以提前查看,以确保立即遵循category

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

不会捕获前瞻,但如果不存在,则字符串将不匹配。

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

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);