Используя javascript и regex, я хотел бы поставить перед каждым словом, то есть в кавычках, плюс.
Учитывая следующую строку:
"this is in quotes" not in quote "more quotes"
Я хотел бы вернуть это:
"+this +is +in +quotes" not in quote "+more +quotes"
После этого я хотел бы удалить все кавычки, что не является проблемой при использовании простой замены, но если это можно сделать за одно регулярное выражение, это было бы здорово.
Я знаю, что могу использовать \"(.*?)\"
Для выделения всего в кавычках, а (?<![^ ])(?=[^ ])
Выбирает начало каждого слова, но я не знаю, как положить все это вместе.
Вы можете сделать это с одним регулярным выражением!
Идея состоит в том, чтобы смотреть вперед и сопоставлять только слова, за которыми следует "... 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
quotes_re = '\\w+(?=[^"]*"([^"]+|" [^"]* " )*$)'
Вы можете сначала сопоставить раздел внутри кавычек и использовать функцию заменителя, которая изменит каждое слово, добавив перед ним знак +
.
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, "+$&");
}