使用javascript和regex,我想在加引号的每个单词前加上一个加号。
给出以下字符串:
"this is in quotes" not in quote "more quotes"
我想返回这个:
"+this +is +in +quotes" not in quote "+more +quotes"
此后,我想删除所有引号,使用简单的替换就不会出现问题,但是如果所有这些都可以在一个正则表达式中完成,那就太酷了。
我知道我可以使用\"(.*?)\"
选择所有用引号引起来的内容,而(?<![^ ])(?=[^ ])
选择每个单词的开头,但是我不知道如何将它们放在一起。
答案 0 :(得分: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
答案 1 :(得分:3)
您可以先将引号内的部分匹配,然后使用a replacer function,该词会通过在其前面附加一个+
来更改每个单词。
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, "+$&");
}