【问题标题】:Replace qualifying spaces with  将符合条件的空格替换为
【发布时间】:2018-03-20 20:14:48
【问题描述】:

我想用  替换所有空格,后面跟着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.,后跟空格,后跟数字/s,后跟点和空格,但我只想要那些以模式开头的空格。

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

【问题讨论】:

  • 您能再提供一个例子吗?并发布您正在使用的相关代码。
  • 为什么不匹配 345<here>dffdfd ?否则,它只是查找 (?:(?!\A)\G|(Fig))([\d.]*)[ ]替换 $1$2 

标签: php regex replace spaces


【解决方案1】:

这是一个棘手的正则表达式。

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

全球查找:(?:(?!\A)\G|(Fig))([\d.]*)(?<=[ .])[ ]
替换:$1$2 

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.]*)(?&lt;=[ .]) 之间有一点 魔法

可选的 [\d.] 将消耗数字和点,
但是 (?或另一个空格。
但例如不会匹配Fig &lt;space&gt;

【讨论】:

  • 这个也有效。为简单起见,我接受了上述答案,但我非常感谢您的解释。我投了赞成票,但只有在我获得 15 分以上的代表分数后才会显示。谢谢你。
  • 这不仅适用于所有情况,而且适用于所有情况,不仅是 Fig.,而且 Mr. St. 以及我不想跟在 dot 后面的任何单词我都对每个单词重复使用了你的正则表达式( ex Fig. Mr. St. 等)。这个正则表达式完美地解决了我的问题!我现在接受这个答案。感谢您的帮助。
  • @KrishnaBasada - 是的,你可以将它们组合成一个交替。除了Fig,您还可以添加任意数量的(?:Fig|St|Ms|Mrs|Mr) 等。
  • 再次感谢 sln 的回复。我添加了一个条件 [A-Z] 来转义大写首字母为 S.M. 的名称。琼斯取代了 S.M. 琼斯。我使用了这个正则表达式: preg_replace('/(?:(?!\A)\G|(Fig|Mr|Mrs|St|etc|[AZ]))([\d.]*)(?
【解决方案2】:

试试这个例子中的 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

【讨论】:

  • 太棒了!不敢相信我这么快就得到了答案!非常感谢 CoursesWeb。我不太擅长使用正则表达式,但我很高兴你帮助了我,你拯救了我的一天。再次感谢!
【解决方案3】:

我认为你有一个 XY 问题。您的实际挑战是正确拆分句子,但相反,您正在改变子字符串以尝试区分点和句号。

虽然我宁愿努力解决最初的问题,但我发现其他答案过于设计,所以我会推荐一个更轻松的模式。

代码:(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.。然后匹配下一个空格。然后捕获数字和点。然后匹配下一个空格。替换使用捕获的子字符串并将其包装在 htmlencoded 空格中。

我的 sn-p 故意替换了“数字和点”后面的空格,这样你的文本中就没有多余的空格了。

【讨论】:

    猜你喜欢
    • 2011-07-12
    • 1970-01-01
    • 2019-12-09
    • 2012-05-15
    • 1970-01-01
    • 2015-05-25
    • 1970-01-01
    • 1970-01-01
    • 2015-11-01
    相关资源
    最近更新 更多