Замена одинарных кавычек на двойные с регулярными выражениями - PullRequest
2 голосов
/ 02 июня 2019

Я пытаюсь изменить все одинарные кавычки на двойные кавычки в строке (если только одинарные кавычки не встречаются в середине слова).Тем не менее, мой код не работает правильно с примером строки:

let r = /(\W)'|'(\W)|^'|'$/g;
let s = "'ble' 'bla' aren't"
s.replace(r, "$1\"$2");

Код возвращает:

""ble" 'bla" aren't"

, поэтому открывающая кавычка 'bla' является одинарной кавычкой.Я не знаю, почему это так. Есть идеи, почему мое решение не работает?

Ответы [ 3 ]

5 голосов
/ 02 июня 2019

Ваше решение не работает из-за дублирования.В e' 'b, '(\W) соответствует ' (кавычка + пробел), пространство используется, а затем следующая кавычка (непосредственно перед b не может быть найдено совпадение, потому что перед ним нет слов).

Заменяйте одиночную кавычку только тогда, когда перед ней стоит пресловутая строка:

let r = /\B'|'\B/g;
let s = "'ble' 'bla' aren't"
s = s.replace(r, "\"");
console.log(s);
0 голосов
/ 02 июня 2019

Правильное использование прямых двойных "и одинарных" кавычек не относится к правильно пунктуированному тексту - они фактически используются в коде. Вьющиеся двойные & ldquo; & rdquo; и одиночные & lsquo; & rsquo; цитаты (иначе умные кавычки) ) следует использовать вместо . Если исходить из контекста, предоставленного примером в OP, необходимость хранить апостроф означает, что текст является содержимым, а не кодом:

Как это: "бле", "бла" нет "
собирается быть: "" ble "" бла "не"
без конфликта?

Двойные кавычки внутри должны быть экранированы или внешние кавычки заменены обратными кавычками, если строка находится внутри кода. Если это просто континент, то, вероятно, он грамматически некорректен (не знаю наверняка)?

Следующая демонстрация заменит прямые двойные и одинарные кавычки своими вьющимися / умными аналогами. Он заменяет прямую одинарную кавычку на фигурную / умную правильную одинарную кавычку & rsquo; когда его не предшествует пробел, ^, |, [, -, -, /, (, \, [, {, " или ], который является предикатом для заключительной цитаты или апострофом .

Вы можете удалить ненужные заявления.

let str = document.querySelector('main').innerHTML;
document.querySelector('output').innerHTML = smarten(str);

function smarten(str) {
  // Opening single quote
  str = str.replace(/(^|[-—/(\[{"\s])'/g, "$1\u2018");
  // Closing single quote and apostrophe
  str = str.replace(/'/g, "\u2019");
  // Opening double quote
  str = str.replace(/(^|[-—/(\[{‘\s])"/g, "$1\u201c");
  // Closing double quote
  str = str.replace(/"/g, "\u201d");
  return str;
}
<main>
  <p>From Sun Tzu's <i>The Art of War</i>, "If you know both yourself and your enemy, you can win numerous (literally, 'a hundred') battles without jeopardy."</p>
</main>
<output></output>
0 голосов
/ 02 июня 2019

Так как регулярное выражение не очень гибкое, вы можете попробовать заменить несколько раз, я могу сделать это заменить 2 раза

let r = /([^a-z])'(\w)/g;
let s = "'ble' 'bla' aren't"
s = s.replace(r, "$1\"$2");
s.replace(/(\w)'([^a-z])/g,"$1\"$2");
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...