首页 > 解决方案 > 正则表达式将字符串的所有部分与 `[0-9_]+` 匹配并跳过可选的 `_[a-z0-9]{24}`?

问题描述

正则表达式匹配字符串的所有片段[0-9_]+并跳过可选_[a-z0-9]{24}

例如,

hello word some_stuff other_stuff_607eea770b6d00003d001579 something

应该只捕获/匹配

hello word some_stuff other_stuff something

这是我所拥有的,但它仍然与某些部分相匹配[a-z0-9]{24}

/[a-z]+(_[a-z]+)?(?:[a-z0-9]{24})?/

标签: regex

解决方案


当您在接受的答案的评论中提到 php 时,您也可以使用SKIP FAIL方法:

_[0-9a-z]{24}(*SKIP)(*FAIL)|[a-z]+(?:_[a-z]+)*

在部分情况下,模式匹配:

  • _[0-9a-z]{24}匹配_和 24 次重复范围 0-9a-z
  • (*SKIP)(*FAIL)上一个匹配不应该是匹配结果的一部分
  • |或者
  • [a-z]+匹配 1+ 个字符 az
  • (?:_[a-z]+)*可选择重复_和 1+ 字符 az

查看正则表达式演示PHP 演示

示例代码

$re = '/_[0-9a-z]{24}(*SKIP)(*FAIL)|[a-z]+(?:_[a-z]+)*/';
$str = 'hello word some_stuff other_stuff_607eea770b6d00003d001579 something';

preg_match_all($re, $str, $matches);

var_export($matches[0]);

输出

array (
  0 => 'hello',
  1 => 'word',
  2 => 'some_stuff',
  3 => 'other_stuff',
  4 => 'something',
)

推荐阅读