将符合条件的空格替换为

Replace qualifying spaces with  

我想将所有 space 替换为  ,仅后跟 Fig. space digit/s and dot

例如,如果字符串是:

Fig. 1. sasasa 
Fig. 34. 345 dffdfd etc. dsds

我想改成:

Fig. 1.  sasasa 
Fig. 34.  345 dffdfd etc. dsds

有没有办法用正则表达式做到这一点?我试过正则表达式 /(Fig\.\s)(\d+)(\.)(\s+)/ 但它匹配 Fig. 后跟 space 后跟 digit/s 后跟点和 space 但我只想要那些 space 前面有模式。

PS:我想这样做的原因是因为我试图拆分以点和 space 结尾的句子。但是在某些句子中有一些单词和数字后跟点和 space(例如 Fig. 1.Mr. etc),所以我想将这些点和 space 替换为  以便正确拆分句子。

试试这个例子中的 Regex 和 preg_replace_callback() 函数:

$str ='Fig. 1. sasasa Fig. 34. 345 dffdfd etc. dsds';
$str = preg_replace_callback('/(Fig\.)[ ]([0-9]+[\.]{1})[ ]*/i', function($m){
  return str_ireplace(' ', ' ', $m[0]);
}, $str);

echo $str;  // Fig. 1. sasasa Fig. 34. 345 dffdfd etc. dsds

或者,从这里:

$str ='Fig. 1. sasasa Fig. 34. 345 dffdfd etc. dsds';
$str = preg_replace_callback('/(Fig\.)[ ]([0-9]+[\.]{1})[ ]*/i', function($m){
  return str_ireplace([$m[1].' ', $m[2]], [$m[1].' ', $m[2].' '], $m[0]);
}, $str);

echo $str; // Fig. 1.  sasasa Fig. 34.  345 dffdfd etc. dsds

这是一个很难正确处理的正则表达式。

这将匹配您匹配的主题字符串。

全局查找:(?:(?!\A)\G|(Fig))([\d.]*)(?<=[ .])[ ]
替换:&nbsp;

https://regex101.com/r/91hgVD/3

评论

 (?:
      (?! \A )              # Not Begin of String
      \G                    # \G anchor, start where last left off
   |                      # or
                            # Reset's \G
      ( Fig )               # (1), Fig
 )
 ( [\d.]* )            # (2), Optional digits or dots
 (?<= [ .] )           # Must be a dot or space behind
 [ ]                   # space

注意 - 在 ([\d.]*)(?<=[ .])

之间发生了一些 魔法

可选的[\d.]会消耗数字和点,
但是 (?<=[ .]) 在 space OR 另一个 space.
之前需要一个点 但不会匹配 Fig <space> 例如。

我想你自己对 XY 问题很在行。您的实际 挑战是正确拆分句子,但相反,您正在改变子字符串以尝试区分点和句号。

虽然我宁愿把精力放在解决原始问题上,但我发现其他答案设计过度,所以我会推荐一个较轻的模式。

代码:(Demo)

$string = <<<STRING
Fig. 1. sasasa 
Fig. 34. 345 dffdfd etc. dsds
STRING;

echo preg_replace('~Fig\.\K (\d+\.) ~', '&nbsp;&nbsp;', $string);

输出:

Fig.&nbsp;1.&nbsp;sasasa 
Fig.&nbsp;34.&nbsp;345 dffdfd etc. dsds

\K 匹配,然后忘记 Fig.。然后匹配下一个space。然后捕获数字和点。然后匹配下一个space。替换使用捕获的子字符串并将其包装在 htmlencoded spaces.

我的代码片段有意替换了“数字和点”之后的 space,这样您的文本中就没有多余的空格了。