#javascript #regex
#javascript #регулярное выражение
Вопрос:
Используя javascript и regex, я хотел бы ставить перед каждым словом, заключенным в кавычки, знак плюс.
Задана следующая строка:
"this is in quotes" not in quote "more quotes"
Я хотел бы вернуть это:
" this is in quotes" not in quote " more quotes"
После этого я хотел бы удалить все кавычки, что не является проблемой при использовании простой замены, но если все это можно выполнить в одном регулярном выражении, это было бы здорово.
Я знаю, что могу использовать "(.*?)"
для выделения всего в кавычки, и (?<![^ ])(?=[^ ])
выбирает начало каждого слова, но я не знаю, как собрать все это вместе.
Комментарии:
1. Обязательно ли использовать одно регулярное выражение для выделения каждого слова в кавычках? Намного проще просто извлечь часть строки в кавычках и обработать ее.
2. на самом деле с регулярными выражениями невозможно анализировать шаблоны с разделителями (например, строки, xml-теги). Лучше делайте это методом разбора по символам. Существует решение, использующее регулярные выражения, но, строго говоря, оно неверно, поскольку начало и конец строк нелегко обрабатывать с помощью регулярных выражений, возможны ошибки
3. @VLAZ нет, это не обязательно должно быть одно регулярное выражение. Это просто бонус, если это возможно.
Ответ №1:
Вы можете сделать это с помощью одного регулярного выражения!
Идея состоит в том, чтобы смотреть вперед и сопоставлять только те слова, за которыми следует «… символы цитируют допустимую строку», где «допустимая строка» не содержит кавычек или сбалансированных пар кавычек.
quotes_re = `
\w # a word
(?= # followed by ..
[^"]* # plain text (possibly empty), and then...
" # a quote, and then...
(
[^"] # some plain text
| # or
" [^"]* " # a quoted string
)* # 0 or more times
$ # end of string
)
`;
let regex = (src, flags) =>
new RegExp(src.replace(/#.*|s /g, ''), flags);
s = '"this is in quotes" not in quote "more quotes" end end'
console.log('regex', regex(quotes_re, 'g').source)
console.log('result', s.replace(regex(quotes_re, 'g'), ' $amp;'))
regex
Утилита обеспечивает поддержку подробных регулярных выражений для JS, вы можете получить исходный код, войдя в журнал regex(quotes_re, 'g').source
Комментарии:
1. Блестяще! Большое тебе спасибо, @georg
2. Мне это действительно нравится. Просто для краткости, полное регулярное выражение в одном
quotes_re = '\w (?=[^"]*"([^"] |" [^"]* " )*$)'
Ответ №2:
Вы можете сначала сопоставить раздел внутри кавычек и использовать функцию замены, которая изменит каждое слово, добавив
перед ним.
let input = '"this is in quotes" not in quote "more quotes"';
let stringInQuotesRegex = /"[^"] "/g;
let output = input.replace(stringInQuotesRegex, replacer)
console.log(output)
function replacer(match) {
let eachWordRegex = /w /g;
return match.replace(eachWordRegex, " $amp;");
}