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 で、nunc で molestie です。Vivamus eu ligula sed augue pretium tincidunt sit 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 で、nunc で molestie です。Vivamus eu ligula sed augue pretium tincidunt sit 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 に答える