php正则表达式只找到空格后跟数字和点

时间:2017-10-09 15:02:05

标签: php regex

我想用 替换所有空格,后面只跟Fig. space digit/s and dot。例如,如果字符串是Fig. 1. sasasa Fig. 34. 345 dffdfd etc. dsds,我想将其替换为:

  1。  sasasa图。  34。  345 dffdfd等等dsds

有没有办法用正则表达式做到这一点?我已经尝试了正则表达式/(Fig\.\s)(\d+)(\\.)(\s+)/,但它匹配Fig.后跟空格后跟数字/ s后跟点和空格但我只想要那些前面有模式的空格。感谢您对此的帮助/提示。感谢。

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

3 个答案:

答案 0 :(得分:1)

这是一个正确的正确的正则表达式。

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

全球查找:(?:(?!\A)\G|(Fig))([\d.]*)(?<=[ .])[ ]
替换:$1$2&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。]将消耗数字和点,
但是(?&lt; = [。])将在空格 OR 另一个空格之前需要一个点。
但是不会匹配Fig <space>

答案 1 :(得分:0)

尝试此示例中的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(' ', '&nbsp;', $m[0]);
}, $str);

echo $str;  // Fig.&nbsp;1.&nbsp;sasasa Fig.&nbsp;34.&nbsp;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].'&nbsp;', $m[2].'&nbsp;'], $m[0]);
}, $str);

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

答案 2 :(得分:0)

我认为您对XY问题有点疑惑。您的 actual 挑战是正确地拆分句子,但是,您正在突变子字符串以尝试区分句点和句点。

虽然我宁愿将精力放在解决原始问题上,但我发现其他答案都过分设计,因此我建议使用更浅的样式。

代码:(Demo

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

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

输出:

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

\K匹配,然后忘记Fig.。然后匹配下一个空格。然后捕获数字和点。然后匹配下一个空格。替换使用捕获的子字符串并将其包装在html编码的空格中。

我的代码段特意替换了“数字和点”之后的空格,以使文本中没有多余的空格。