3

我在将一些正则表达式从用于 preg_match_all 转换为用于 preg_replace 时遇到了一些困难。

基本上,仅通过正则表达式,我想匹配前面有空格、文本开头或连字符的大写字符。这不是问题,我有以下效果很好:

preg_match_all('/(?<= |\A|-)[A-Z]/',$str,$results);
echo '<pre>' . print_r($results,true) . '</pre>';

现在,我想做的是使用 preg_replace 只返回与我上面的条件匹配的大写字符的字符串。如果我将正则表达式直接移植到 preg_replace,那么它显然会替换我想要保留的字符。

任何帮助将非常感激 :)

另外,我完全知道正则表达式在效率方面并不是最好的解决方案,但我还是想使用 preg_replace。

4

2 回答 2

2

根据德摩根定律
如果你想保留那些

  • A-Z, 和
  • 前面有[space], \A, 或-

那么你想删除那些字符

  • 不是 A-Z
  • 前面没有[space], \A, 或-

也许这个(用空字符串替换匹配)?

/[^A-Z]|(?<! |\A|-)./

请参见此处的示例

于 2012-04-25T20:29:00.783 回答
1

我认为它会是这样的:

$sString = preg_replace('@.*?(?<= |\A|-)([A-Z])([a-z]+)@m',"$1", $sString);
于 2012-04-25T20:09:25.873 回答