preg_replace匹配的字符串以外的不匹配字符


preg_replace non-matched characters except matched strings

我有这样的字符串:

// 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_*(

所以这可能吗?如果是,我怎么能做到这一点?

像这样:

~'d+'.'d+ [a-zA-Z]+'b(*SKIP)(*F)|.~

用 A 作为替换。

演示

(*SKIP)强制在模式失败后不重试以前匹配的位置。 (*F)(*FAIL)会强制模式失败。

请注意,要处理没有小数的值,应将'd+'.'d+替换为'd+(?:'.'d+)?


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

pattern: ((?:'d+(?:'.'d+)? [a-zA-Z]+'b)*).
replacement: '1A
or: $1A

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

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