【问题标题】:Avoiding removing undesired characters inside a string prefix避免删除字符串前缀中不需要的字符
【发布时间】:2021-04-08 20:14:31
【问题描述】:

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

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

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

b7001_cp_parc_venc_fluxo

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

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

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

【问题讨论】:

  • 试试/^b[0-9]{4}(*SKIP)(*F)|[^a-z_]/。你的意思是b7001_cp_parc_venc_fluxo 应该在preg_replace 之后保持不变?

标签: php regex preg-replace


【解决方案1】:

一种选择是使用SKIP FAIL

b[0-9]{4}(*SKIP)(*F)|[^a-z_]
  • b[0-9]{4}(*SKIP)(*F) 匹配你想要避免的东西
  • |或者
  • [^a-z_] 匹配除a-z_ 以外的任何字符

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

Regex demo | Php demo

例子

$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_

【讨论】:

  • 感谢您的回复。正如@Wiktor 回答中的\K,我也不知道跳过失败!
【解决方案2】:

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

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

请参阅regex demo

详情

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

PHP demo:

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

【讨论】:

  • 您完全正确!我不知道\K,谢谢!
猜你喜欢
  • 2016-06-29
  • 2011-05-08
  • 2011-12-24
  • 2021-01-13
  • 2015-08-06
  • 1970-01-01
  • 2011-02-16
相关资源
最近更新 更多