0

可以说有这样的事情

Lorem ipsum dolor sit amet, consectetur adipiscing elit。"Vestibulum interdum dolor nec sapien blandit a suscipit arcu fermentum. Nullam lacinia ipsum vitae enim consequat iaculis quis in augue. Phasellus fermentum congue blandit. Donec laoreet, ipsum et vestibulum vulputate, risus augue commodo nisi, vel hendrerit sem justo sed mauris."Phasellus ut nunc neque,id varius nunc。在 enim lectus、blandit et dictum at、molestie in nunc。Vivamus eu ligula sed augue pretium tincidunt sat amet ac nisl。"Morbi eu elit diam, sed tristique nunc."

变成这样

Lorem ipsum dolor sit amet, consectetur adipiscing elit。"Vestibulum interdum dolor nec sapien blandit a suscipit arcu fermentum[dot] Nullam lacinia ipsum vitae enim consequat iaculis quis in augue[dot] Phasellus fermentum congue blandit[dot] Donec laoreet, ipsum et vestibulum vulputate, risus augue commodo nisi, vel hendrerit sem justo sed mauris[dot]"Phasellus ut nunc neque,id varius nunc。在 enim lectus、blandit et dictum at、molestie in nunc。Vivamus eu ligula sed augue pretium tincidunt sat amet ac nisl。"Morbi eu elit diam, sed tristique nunc[dot]"

我以某种方式找到了一个正则表达式来选择所有“{sentence}”"(.)+?"或使用它们

regex('"(.)+?"','[sentence]')

但是我们可以做一些类似替换组内的点的事情吗?所以我可以得到上面例子的输出?

4

4 回答 4

1

我不确定正则表达式是否能够自行满足您的需求。

您应该实现一个替换嵌套点的算法,直到字符串不再包含嵌套点。

例如在 PHP 中:

$string = 'He asked "Please." while she answered "No. Or maybe yes."';
var_dump($string);
while(preg_match('/"[^"]*\.[^"]*"/', $string)) {
    $string = preg_replace('/("[^"]*)\.([^"]*")/', '$1[dot]$2', $string);
}
var_dump($string);

打印:

string 'He asked "Please." while she answered "No. Or maybe yes."' (length=57)
string 'He asked "Please[dot]" while she answered "No[dot] Or maybe yes[dot]"' (length=69)
于 2012-10-30T13:04:33.607 回答
1

这就是我会做的。

echo
preg_replace_callback('~(?<!\\\)"(.+?)((?<!\\\)")~',
/*
Pattern:
--------
(?<!\\\)"       a double quote not preceded by a backward (escaping) slash
(.+?)           anything (with min 1 char.) between condition above and below
((?<!\\\)")     a double quote not preceded by a backward (escaping) slash
*/
// for anything that matches the above pattern
// the following function is called
create_function('$m',
'return preg_replace("~\.~","[dot]",$m[0]);'),
// which replaces each dot with [dot] and returns the match
$str);

编辑:在评论中添加了解释。

于 2012-10-30T13:05:38.753 回答
0

试试这个 (\"[^\.]*)\.([^\"]*)\1[dot]\2

在我的编辑器中运行良好,但有时使用 $ 而不是 \ 代替(例如在 php 中)

于 2012-10-30T12:52:02.977 回答
0

使用 Javascript,我只需做一个基本的替换:

str = str.replace(/".+?"/g,function(m) {
    return m.replace(/\./g,'[dot]');
});
于 2012-10-30T14:27:25.830 回答