正则表达式检测奇数个连续引号

时间:2014-01-30 02:53:55

标签: javascript regex

如果字符串包含单引号",我需要用双引号""替换它。但是,有时候一个有效的双引号可以跟一个单引号,例如。 """,只需要在末尾添加另一个引用。如果我使用标准替换,例如。 replace('"', '""'),所有引号都变成了双打,当然,不仅仅是奇数。

我需要的是找到任何奇数个连续引号(包括一个单独的引号)并简单地在末尾添加另一个引号。例如。 "变为"""""变为""""

JavaScript中是否有正则表达式替换可以实现此目的?

3 个答案:

答案 0 :(得分:6)

报价是否连续?除非我误解了你的要求,否则这会有效......

str = str.replace(/\"\"?/g, '""')

说明:匹配单个引号,可选地后跟另一个引号,并用两个引号替换一个/两个。

示例: http://jsfiddle.net/aR6p2/

或者,如果只是在字符串中有奇数引号时附加引号的问题......

  var count = str.split('"').length - 1
  str = str + (count % 2 == 0 ? '' : '"')

答案 1 :(得分:1)

你可以这样做:

var str = '"" """" """ """""';
var re = /([^"]|^)"("")*(?!")/g;
console.log(str.replace(re, '$1(quotes)')); // '"" """" (quotes) (quotes)'

这是做什么的:

  • 它匹配非引号 - 或输入字符串的开头 - 首先,并将其存储在第一个捕获组中
  • 然后匹配一个双引号
  • 然后是一组2个双引号,任意次数(0或更多)
  • 然后检查下一个字符是否为非引用,但实际上没有匹配。
  • 然后将其替换为第一个捕获组(非引用)捕获的值和字符串(quotes)

基本上,它只是用(quotes)替换任何奇数的双引号。

Demo

答案 2 :(得分:0)

可能有一个疯狂的正则表达式可以做到这一点,但为了防止自己发疯,我会这样做。

str = str.replace(/[^"]("+)/, function(match, group1){
   if((group1.length % 2) === 1 || group1.length === 1){
      return group1+'"';
   }
   return group1;
});