将符合条件的空格替换为
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.]*)(?<=[ .])[ ]
替换:
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+\.) ~', ' ', $string);
输出:
Fig. 1. sasasa
Fig. 34. 345 dffdfd etc. dsds
\K
匹配,然后忘记 Fig.
。然后匹配下一个space。然后捕获数字和点。然后匹配下一个space。替换使用捕获的子字符串并将其包装在 htmlencoded spaces.
中
我的代码片段有意替换了“数字和点”之后的 space,这样您的文本中就没有多余的空格了。
我想将所有 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.]*)(?<=[ .])[ ]
替换:
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+\.) ~', ' ', $string);
输出:
Fig. 1. sasasa
Fig. 34. 345 dffdfd etc. dsds
\K
匹配,然后忘记 Fig.
。然后匹配下一个space。然后捕获数字和点。然后匹配下一个space。替换使用捕获的子字符串并将其包装在 htmlencoded spaces.
我的代码片段有意替换了“数字和点”之后的 space,这样您的文本中就没有多余的空格了。