Regex: префикс каждого слова в кавычках - PullRequest
1 голос
/ 27 марта 2019

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

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

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

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

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

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

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

Ответы [ 2 ]

4 голосов
/ 27 марта 2019

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

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

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

3 голосов
/ 27 марта 2019

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

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, "+$&");
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...