如何用正则表达式替换句子中的引号内的点

时间:2012-10-30 12:38:47

标签: regex

让我们说有类似的东西

  

Lorem ipsum dolor坐下来,精神上的精神。 "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 sit amet ac nisl。 "Morbi eu elit diam, sed tristique nunc."

是这样的

  

Lorem ipsum dolor坐下来,精神上的精神。 "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 sit amet ac nisl。 "Morbi eu elit diam, sed tristique nunc[dot]"

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

一样使用它们

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

但是我们可以做一些事情,比如替换群组内的点吗?所以我可以像上面那样得到输出?

4 个答案:

答案 0 :(得分: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)

答案 1 :(得分: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);

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

答案 2 :(得分:0)

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

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

答案 3 :(得分:0)

使用Javascript我会做一个基本的替换:

str = str.replace(/".+?"/g,function(m) {
    return m.replace(/\./g,'[dot]');
});