Regex: префикс каждого слова в кавычках

1

Используя javascript и regex, я хотел бы поставить перед каждым словом, то есть в кавычках, плюс.

Учитывая следующую строку:

"this is in quotes" not in quote "more quotes"

Я хотел бы вернуть это:

"+this +is +in +quotes" not in quote "+more +quotes"

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

Я знаю, что могу использовать \"(.*?)\" Для выделения всего в кавычках, а (?<![^ ])(?=[^ ]) Выбирает начало каждого слова, но я не знаю, как положить все это вместе.

  • 0
    Должен ли быть один регулярное выражение, чтобы выбрать каждое слово в кавычках? Проще просто извлечь часть строки в кавычках и обработать ее.
  • 0
    на самом деле невозможно использовать регулярные выражения для анализа шаблонов с разделителями (например, строк, xml-тегов). Лучше делать это в манере разбора за символом. Существует решение, использующее регулярные выражения, но, строго говоря, оно не является правильным, поскольку начало и конец строк не так просто обработать с помощью регулярных выражений, возможно, что произойдут ошибки
Показать ещё 1 комментарий
Теги:

2 ответа

4
Лучший ответ

Вы можете сделать это с одним регулярным выражением!

Идея состоит в том, чтобы смотреть вперед и сопоставлять только слова, за которыми следует "... chars quote valid-string", где "valid-string" не содержит ни кавычек, ни сбалансированных пар кавычек.

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'), '+$&'))

Утилита regex обеспечивает поддержку подробных регулярных выражений для JS, вы можете получить необработанный источник, regex(quotes_re, 'g').source

  • 0
    Brilliant! Большое спасибо, @georg
  • 1
    Мне действительно это нравится. Просто для краткости, полное регулярное выражение в одном из них - quotes_re = '\\w+(?=[^"]*"([^"]+|" [^"]* " )*$)'
3

Вы можете сначала сопоставить раздел внутри кавычек и использовать функцию заменителя, которая изменит каждое слово, добавив перед ним знак +.

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, "+$&");
}
  • 0
    Это работает отлично. Большое спасибо, @VLAZ

Ещё вопросы

Сообщество Overcoder
Наверх
Меню