php - 正则表达式字符串必须仅包含某些子字符串并用空格分隔
问题描述
所以,我一直在尝试在 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/中进行了多次迭代,但仍然没有成功。
显然,我不是正则表达式方面的专家,所以在这里将不胜感激。
解决方案
您可以使用
(?<!\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]);
}
推荐阅读
- llvm-lit - Lit-llvm - 获取当前目录(不是完整路径)
- excel - 对指定列但可变行的整个数据集进行自定义排序
- c# - 在 MediatR 命令/查询模式中传递会话数据
- react-native - 如何从堆栈导航器访问 navigation.toggleDrawer()?
- javascript - 在没有 AJAX 的情况下使用“WooCommerce 结帐时更改数量”插件
- ios - PHPickerViewController,双击图像调用didFinishPicking两次
- mysql - 石墨烯 Django 的 MySQL 复制
- sql - 如何在 Postgres 中将 3 个表组合在一起?
- java - 如何使用 Java Streams 合并对象中类型列表的成员,这样我们得到一个列表
- r - 通过扩展两次将数据重塑为长格式,首先是“年”,然后是“月”