У меня есть приложение, которое использует основанный на JavaScript механизм правил. Мне нужен способ преобразовать регулярные прямые кавычки в изогнутый (или умный) кавычки. Было бы легко просто сделать a string.replace
для ["]
, только это только вставит один случай изогнутой кавычки.
Лучшим способом я мог думать, должен был заменить первое вхождение кавычки с левой изогнутой кавычкой и любой после с левым, и остальные изогнутое право.
Существует ли способ выполнить это использование JavaScript?
Вы можете заменить все, что предшествует символу слова, левой кавычкой, и все такое после символа слова ставьте правильную кавычку.
str = str.replace(/"(?=\w|$)/g, "“");
str = str.replace(/(?<=\w|^)"/g, "”"); // IF the language supports look-
// behind. Otherwise, see below.
Как указано в комментариях ниже, при этом не учитывается пунктуация, но легко можно:
/(?<=[\w,.?!\)]|^)"/g
[ Изменить :] Для языков, которые не поддерживают ретроспективный просмотр, например Javascript, если вы сначала замените все лицевые, у вас есть два варианта:
str = str.replace(/"/g, "”"); // Replace the rest with right curly quotes
// or...
str = str.replace(/\b"/g, "”"); // Replace any quotes after a word
// boundary with right curly quotes
(I оставил исходное решение, приведенное выше, на случай, если оно будет полезно для кого-то, использующего язык, поддерживающий ретроспективный анализ)
'foo "foo bar" "bar"'.replace(/"([-a-zA-Z0-9 ]+)"/g, function(wholeMatch, m1){
return "“" + m1 + "”";
});
Я не думаю, что что что-то подобное в целом вообще легко, потому что вам пришлось бы интерпретировать именно то, что означает каждый символ двойной кавычки в вашем содержании. Тем не менее, я бы собрал все интересующие меня текстовые узлы, а затем просмотрел и отследил бы "вкл/выкл" (или "нечётный/чётный"; неважно) характер каждого экземпляра двойных кавычек. Затем вы можете узнать, какой заменяющий объект использовать.
Вы можете посмотреть, что делает Pandoc - очевидно, с опцией - smart
он правильно обрабатывает кавычки во всех случаях (включая, например, ’tis и’ twere).
Недавно я написал механизм претификации типографики Javascript, который, помимо прочего, выполняет замену цитат; Я в основном использовал алгоритм, предложенный Renesis , но в настоящее время есть неудачный тест, ожидающий более разумного решения.
Если вы хотите списать мой код (и / или отправить патч на основе проделанной работы), посмотрите его: jsPrettify . jsprettify.prettifyStr
делает то, что вы ищете. Если вы не хотите иметь дело с зависимостью Closure, есть более старая версия , которая работает сама по себе - она работает даже в Rhino.