Почему следующее регулярное выражение удаляет ограничивающие символы внутри одинарных кавычек? - PullRequest
1 голос
/ 15 марта 2020

Этот код превращает прямые одинарные кавычки в фигурные одинарные кавычки:

var result = 'This \'is an\' example'.replace(/(?<!\w)\'\S(.*?)\S\'(?!\w)/g, '&lsquo;$1&rsquo;')
alert(result)

Я думал, что результат будет:

Это пример '

Но вывод был таким:

Это пример 'sa'

Я не уверен, почему удаляются ограничивающие символы внутри кавычек.

Почему это и как это исправить?

https://jsfiddle.net/gz5wjoqx/

1 Ответ

3 голосов
/ 15 марта 2020

Вы соответствует двум \S частям, не захватывая их:

.replace(/(?<!\w)\'\S(.*?)\S\'(?!\w)/g
//                 ^^     ^^

Таким образом, при замене на первую группу захвата, заключенную в кавычки:

'&lsquo;$1&rsquo;'
//      ^^

Символы \S не входят в группу захвата (.*?), поэтому они не включены в замену $1.

Поместите все, что вы хотите заменить, в группу захвата :

var result = 'This \'is an\' example'
  .replace(
    /(?<!\w)'(\S.*?\S)'(?!\w)/g,
    '&lsquo;$1&rsquo;'
  );
console.log(result)

(также обратите внимание, что ' не нужно экранировать в шаблоне)

Вы также можете рассмотреть возможность использования \B ("not граница слова ") вместо отрицательного поиска для \w, что сделает шаблон совместимым со старыми браузерами и более краткими:

var result = 'This \'is an\' example'
  .replace(
    /\B'(\S.*?\S)'\B/g,
    '&lsquo;$1&rsquo;'
  );
console.log(result)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...