我想用
替换所有空格,后面只跟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
),所以我想将这些点和空格替换为
以便句子正确分割。
答案 0 :(得分: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.]*)
和(?<=[ .])
可选的[\ 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(' ', ' ', $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
答案 2 :(得分:0)
我认为您对XY问题有点疑惑。您的 actual 挑战是正确地拆分句子,但是,您正在突变子字符串以尝试区分句点和句点。
虽然我宁愿将精力放在解决原始问题上,但我发现其他答案都过分设计,因此我建议使用更浅的样式。
代码:(Demo)
$string = <<<STRING
Fig. 1. sasasa
Fig. 34. 345 dffdfd etc. dsds
STRING;
echo preg_replace('~Fig\.\K (\d+\.) ~', ' $1 ', $string);
输出:
Fig. 1. sasasa
Fig. 34. 345 dffdfd etc. dsds
\K
匹配,然后忘记Fig.
。然后匹配下一个空格。然后捕获数字和点。然后匹配下一个空格。替换使用捕获的子字符串并将其包装在html编码的空格中。
我的代码段特意替换了“数字和点”之后的空格,以使文本中没有多余的空格。