3

我需要 Javascript 中正则表达式的帮助。我正在寻找一种~::~仅在引号内替换子字符串的方法。这是我的情况:

源字符串:

"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,'');

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

非常感谢您的帮助。

——瓦迪姆

4

3 回答 3

2

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

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

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

JSFiddle 演示

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

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

他们漂亮的照片!

正则表达式可视化

于 2013-08-16T18:59:20.283 回答
1

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

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

第一个模式匹配一​​个双引号字符串,它允许转义引号(并且真的转义了任何东西),以展开循环模式的形式。

回调函数在索引处获取一个完整匹配的数组,0并在后续索引处获取子组(与您的情况无关)。我们取出整个匹配,~::~从中删除所有内容,然后返回。

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

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

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

于 2013-08-16T18:57:22.040 回答
1

描述

与其像在您的示例中那样捕获单个引用的子字符串,为什么不在一个操作中执行此操作,其中有问题的字符串被替换而忽略其他字符串。

这些表达式将:

  • 忽略转义引号,例如"some \"text is quoted\" in here"
  • 找到~::~匹配的引用部分内部或外部的期望值由特定表达式确定。
  • 假设输入字符串已经有正确平衡的引号

请注意,唯一的区别是正或负前瞻

正则表达式:~::~(?!(?:(?:\\"|[^\\"])*(?:"(?:\\"|[^"])*){2})*$)~::~会找到侧引号字符串中的

正则表达式:~::~(?=(?:(?:\\"|[^\\"])*(?:"(?:\\"|[^"])*){2})*$)这会找到~::~哪些是外部引用的字符串,包括在此处以获得额外的功劳,但未在下面演示。

替换为:空字符串

在此处输入图像描述

例子

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

示例文本

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

更换后

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


或者

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

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

在此处输入图像描述

例子

示例文本

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

火柴

[0] => "bbb"
[1] => "ccc ~::~ c\"cc ~::~ ccc"
[2] => "ddd"
[3] => "eee"
于 2013-08-17T06:08:25.013 回答