Регулярное выражение: добавляйте префикс к каждому слову в кавычках

#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;");
}