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

Php 在分隔符之间匹配选择文本,php,regex,Php,Regex,出于某种原因,我的正则表达式与我想要的和额外的匹配。我只需要匹配组#,但它也匹配电话号码的第一个号码 示例数据: 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: E

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

示例数据:

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
正则表达式

电流输出

1
2
1
1
2
1
1
2
预期产量

1
2
1
2
1
2

您可以进行前瞻,以确保
category
立即跟进:

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

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

您可以进行前瞻,以确保
类别紧跟其后:

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

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

您可以使用以下选项,这也将排除空白并提供精确匹配

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

更好的是,只需简单地匹配
组:
和以下数字即可

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

您可以使用以下命令,这也将排除空白并提供精确匹配

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

更好的是,只需简单地匹配
组:
和以下数字即可

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

通过更改正则表达式

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

问题是,您还需要“:”在电话和电子邮件之后

通过

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


问题是,你还有:“在电话和电子邮件之后

如果职位没有改变,你可以简单地使用substr(),如果职位没有改变,你可以简单地使用substr()来解释否决票?这是有效的,你必须匹配“group:”后面的整数,它匹配的是group后面的数字!如果你看一下我提供的两个链接,你会发现它与组号匹配,我会在你开始对答案进行向下投票之前重新思考。同样,它与组号匹配,正如他所说,他希望他的输出是一样的。你想解释一下向下投票吗?这是有效的,你必须匹配“group:”后面的整数,它匹配的是group后面的数字!如果你看一下我提供的两个链接,你会发现它与组号匹配,在你开始对答案进行向下投票之前,我会重新考虑。同样,它与组号匹配,正如他所说的那样。你必须匹配“group:”后面的整数。@Ulrichorus在发表评论和向下投票之前,你有没有想过?我正在匹配
类别
之前的数字,这与给定的数据完全相同。那么电话和电子邮件之后的整数呢?@Ulrichorus我不知道,他们呢?@Ulrichorus你知道,对正确答案投反对票是很不礼貌的(顺便说一句,这是)而不是解释原因。你必须匹配“group:”后面的整数@Ulrichorus在你发表评论和投反对票之前你有没有想过?我正在匹配
类别
之前的数字,这与给定的数据完全相同。那么电话和电子邮件之后的整数呢?@Ulrichorus我不知道,他们呢?@Ulrichorus你知道,对正确答案投反对票是很不礼貌的(顺便说一句,这是)没有解释原因。其他答案确实有效,但我认为这一个是最好的。捕获组使得只提取数字变得很容易,而且它比环顾四周的方法更简单、更灵活。其他答案确实有效,但我认为这一个是最好的。捕获组使得只提取数字变得很容易,而且它比环视方法更简单、更灵活。