避免删除字符串前缀中不需要的字符
Avoiding removing undesired characters inside a string prefix
我有一个简单的正则表达式可以从字符串中删除不需要的字符(例如数字):
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
或 _
以外的任何字符
您也可以将字符 class 重复 1 次以上 [^a-z_]+
以获得连续字符的单个匹配。
例子
$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 demo。
详情
^b[0-9]{4}\K
- 在字符串的开头找到 b
和四位数字,然后 \K
operator 丢弃匹配的文本,因此没有任何内容被替换
|
- 或
[^a-z_]+
- 匹配除小写 ASCII 字母或下划线以外的一个或多个字符,这些匹配将被删除。
$string = 'b7001_cp---_parc1323546_venc.,?><_ fluxo';
echo preg_replace('/^b[0-9]{4}\K|[^a-z_]/', '', $string);
// => b7001_cp_parc_venc_fluxo
我有一个简单的正则表达式可以从字符串中删除不需要的字符(例如数字):
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
或_
以外的任何字符
您也可以将字符 class 重复 1 次以上 [^a-z_]+
以获得连续字符的单个匹配。
例子
$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 demo。
详情
^b[0-9]{4}\K
- 在字符串的开头找到b
和四位数字,然后\K
operator 丢弃匹配的文本,因此没有任何内容被替换|
- 或[^a-z_]+
- 匹配除小写 ASCII 字母或下划线以外的一个或多个字符,这些匹配将被删除。
$string = 'b7001_cp---_parc1323546_venc.,?><_ fluxo';
echo preg_replace('/^b[0-9]{4}\K|[^a-z_]/', '', $string);
// => b7001_cp_parc_venc_fluxo