正则表达式:每个词都用引号引起来

时间:2019-03-27 12:58:05

标签: javascript regex

使用javascript和regex,我想在加引号的每个单词前加上一个加号。

给出以下字符串:

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

我想返回这个:

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

此后,我想删除所有引号,使用简单的替换就不会出现问题,但是如果所有这些都可以在一个正则表达式中完成,那就太酷了。

我知道我可以使用\"(.*?)\"选择所有用引号引起来的内容,而(?<![^ ])(?=[^ ])选择每个单词的开头,但是我不知道如何将它们放在一起。

2 个答案:

答案 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, "+$&");
}