php - preg_replace不匹配的字符,但匹配的字符串

时间:2016-01-02 23:47:48

标签: php regex preg-replace

我有这样的字符串:

// example
$str1 = "     10.503 GB  3.4 GiB   ";
$str2 = "  40.29 KiB    ";
$str3 = "14.3 GB    2.1 51   ";

这是我的正则表达式,匹配字符串" 10.503 GB"," 3.4 GiB"," 40.29 KiB"和" 14.3 GB"分别

$regex = '/(\d+\.\d+ [A-Za-z]+[^\s])/';
preg_match_all($regex, $str1, $out1);
preg_match_all($regex, $str2, $out2);
preg_match_all($regex, $str3, $out3);

所以问题是,如何替换不匹配我的正则表达式模式的非匹配字符和用户定义的字符?示例如下:

$char = 'A'; // assume this is user input
$str1 = "     10.503 GB  3.4 GiB   ";
$str2 = "  40.29 KiB    ";
$str3 = "14.3 GB    2.1 51   ";

/* preg_replace (or another preg_* magic here */

所以最后的字符串将是

$str1 = "AAAAA10.503 GBAA3.4 GiBAAA";
$str2 = "AA40.29 KiBAAAA";
$str3 = "14.3 GBAAAAAAAAAAAAA";

我知道解决方案没有使用preg_replace,但只是假装preg_replace在这里是必要的(如果你愿意,还可以假装另一个preg_ *)

所以它可能吗?如果是的话,我该如何实现呢?

1 个答案:

答案 0 :(得分:1)

类似的东西:

(*SKIP)

以A代替。

demo

(*F)强制在模式失败后不重试先前匹配的位置。 (*FAIL)\d+\.\d+强制模式失败。

请注意,要处理不带小数的值,您应该将\d+(?:\.\d+)?替换为pattern: ((?:\d+(?:\.\d+)? [a-zA-Z]+\b)*). replacement: \1A or: $1A

如果您没有使用带有这些回溯控制动词的正则表达式引擎(仅适用于Perl,使用PCRE的语言或新的Python正则表达式模块),您可以通过捕获组和反向引用实现相同的功能:

pattern: (?:\d+(?:\.\d+)? [a-zA-Z]+\b)*\K.
replacement: A

使用PCRE,Perl,Python正则表达式模块和Ruby 2,您也可以这样做:

{{1}}