在javascript中删除或替换模式中的子字符串

时间:2013-08-16 18:52:34

标签: javascript regex

我在Javascript中需要有关regexp的帮助。我正在寻找一种方法来替换子串~::~,只有它在引号内。这是我的情况:

源字符串:

"aa\"aa\"aa"~::~ "bbb~::~bbb"  "ccc" ~::~ 
                     ^^^^
                     sub string to remove  

所需字符串:"aa\"aa\"aa"~::~ "bbbbbb" "ccc" ~::~

示例代码:

var str =' "aa\"aa\"aa"~::~ "bbb~::~bbb"  "ccc" ~::~  ';
var re = /(").*?\1/g;    <-- *just found that it's wrong, as it doesn't support escaped quotes (VK)*
str.replace(re,'');

问题是我的表达式不支持转义引号。

非常感谢你的帮助。

- 瓦迪姆

3 个答案:

答案 0 :(得分:2)

你可以在这样的正则表达式上使用替换:

~::~(?=(?:[^"]*"[^"]*")*[^"]*"[^"]*$)

这可能有点难以理解,但它基本上确保你所替换的~::~之后有奇数引号。

JSFiddle demo

好的,有了转义引号,它有点复杂,因为正则表达式也必须“吃掉”转义的引号。你可以试试这个:

~::~(?=(?:(?:[^\\"]|\\"|\\\\)*"(?:[^\\"]|\\"|\\\\)*")*(?:[^\\"]|\\"|\\\\)*"(?:[^\\"]|\\"|\\\\)*$)

'漂亮的照片!

Regular expression visualization

答案 1 :(得分:1)

使用替换回调,您基本上可以将一个替换嵌套在另一个替换中:

str = str.replace(/"[^"\\]*(?:\\.[^"\\]*)*"/g, function(m) {
          return m[0].replace(/~::~/g, "");
      });

第一个模式匹配双引号字符串,该字符串允许以unrolling-the-loop模式的形式转义引号(并实际转义任何内容)。

回调函数获取一个数组,其中索引为0的整个匹配,后续索引处捕获的子组(在您的情况下不相关)。我们接受整个匹配,从中删除所有~::~,然后将其返回。

或者,如果您的引号始终匹配,那么您要删除的~::~后面会跟随奇数"

str = str.replace(/~::~(?=[^"\\]*(?:\\.[^"\\]*)*"[^"]*(?:"[^"\\]*(?:\\.[^"\\]*)*"[^"]*)*$)/g, "");

它看起来很糟糕,但实质上,它使用与上述模式相同的技巧来解释逃逸。然后确保只匹配一个",后跟恰好偶数"(以及任意多个其他字符)。

答案 2 :(得分:1)

描述

为什么不在一个操作中捕获单个引用的子串,而不是像在你的例子中那样捕获单个引用的子串,而不是在忽略其他字符串的情况下替换有问题的字符串。

这些表达式将:

  • 忽略"some \"text is quoted\" in here"
  • 等转义引号
  • 找到所需的~::~,它们位于引用部分的内部或外部,匹配由特定表达式确定。
  • 假设输入字符串已经具有正确平衡的引号

请注意,唯一的区别在于前瞻性或前瞻性

正则表达式:~::~(?!(?:(?:\\"|[^\\"])*(?:"(?:\\"|[^"])*){2})*$)这会找到<{>} 边引用字符串中的<{1}}

正则表达式:~::~这会找到~::~(?=(?:(?:\\"|[^\\"])*(?:"(?:\\"|[^"])*){2})*$) out 边引用字符串,此处包含额外信用但未在下方演示。

替换为:空字符串

enter image description here

实施例

Live Demo在示例中,您对显示输出的“input.replace()”字段感兴趣。

示例文字

~::~

替换后

~::~ aaa "bbb" "ccc ~::~ cc\"c ~::~ ccc" "ddd" ~::~ "eee" ~::~


或者

如果您真的想要捕获引用的字符串而忽略转义的引号,那么:

~::~ aaa "bbb" "ccc cc\"c ccc" "ddd" ~::~ "eee" ~::~

enter image description here

实施例

示例文字

"(?:\\"|[^"])*"

<强>匹配

~::~ aaa "bbb" "ccc ~::~ cc\"c ~::~ ccc" "ddd" ~::~ "eee" ~::~