避免删除字符串前缀中不需要的字符



我有一个简单的正则表达式来从字符串中删除不需要的字符(例如数字(:

preg_replace(/[^a-z_]/, '', $str);

但现在它必须保留一个前缀,其中包含一些被删除的字符。该前缀格式由一个字母字符和四个数字组成(前缀示例:b1234(。字符串示例:

b7001_cp_parc_venc_fluxo

因此,我尝试为该前缀添加一个非捕获组,但我无法使其工作。尝试使用以下内容:

(?:b[0-9]{4})[^a-z_]

但它停止删除整个字符串中的数字字符,例如。

一个选项是使用SKIP FAIL。

b[0-9]{4}(*SKIP)(*F)|[^a-z_]
  • b[0-9]{4}(*SKIP)(*F)匹配您想要避免的内容
  • |
  • [^a-z_]匹配除a-z_之外的任何字符

您还可以将字符类重复1+次[^a-z_]+,以获得连续字符的单个匹配。

Regex演示| Php演示

示例

$pattern = "/b[0-9]{4}(*SKIP)(*F)|[^a-z_]/";
$str = "b7001_cp_parc_venc_fluxo_1234";
echo preg_replace($pattern, "", $str);

输出

b7001_cp_parc_venc_fluxo_

由于正在删除找到的匹配项,因此也可以使用

preg_replace('~^b[0-9]{4}K|[^a-z_]+~', '', $string)

请参阅regex演示。

详细信息

  • ^b[0-9]{4}K-在字符串开头找到b和四位数字,然后K运算符丢弃匹配的文本,因此不会替换任何内容
  • |-或
  • [^a-z_]+-匹配除小写ASCII字母或下划线之外的一个或多个字符,这些匹配将被删除

PHP演示:

$string = 'b7001_cp---_parc1323546_venc.,?><_     fluxo';
echo preg_replace('/^b[0-9]{4}K|[^a-z_]/', '', $string);
// => b7001_cp_parc_venc_fluxo

最新更新