首页 > 解决方案 > 正则表达式字符串必须仅包含某些子字符串并用空格分隔

问题描述

所以,我一直在尝试在 PHP 中提出一个正则表达式,它可以从更大的单词和字符序列字符串中挑选出像“XX-035”(或者“XX035”或“XX35”)这样的子字符串——这很容易部分 -附加条件是必需的子字符串必须用一个或多个空白字符与主字符串中的其他子字符串分隔

此外,子字符串还必须以特定的两个字母组开头,如“AB”、“CG”或“MS”等,后跟零或一个破折号,然后是 1 到 4 个数字(同样,这部分很简单)。所以,我尝试了许多不同的正则表达式,有和没有 \b 字边界,有和没有空格 \s,最新的如下:

/\b(\s+[^\/a-zA-Z](AB|CG|MS|MT|NA|OQ|TS){1}[\-]?\d{1,4})\b/i

但我似乎无法破解空白要求。我在https://regex101.com/中进行了多次迭代,但仍然没有成功。

显然,我不是正则表达式方面的专家,所以在这里将不胜感激。

标签: phpregex

解决方案


您可以使用

(?<!\S)(?:AB|CG|MS|MT|NA|OQ|TS)-?\d{1,4}(?!\S)

查看正则表达式演示

细节

  • (?<!\S)- 前一个字符应该是空格或字符串开头
  • (?:AB|CG|MS|MT|NA|OQ|TS)- 2 字母替代方案之一
  • -?- 一个可选的连字符
  • \d{1,4}- 一到四位数
  • (?!\S)- 下一个字符应该是空格或字符串结尾。

PHP:

if (preg_match_all('~(?<!\S)(?:AB|CG|MS|MT|NA|OQ|TS)-?\d{1,4}(?!\S)~', $s, $matches)) {
    print_r($matches[0]);
}

推荐阅读