我在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,'');
问题是我的表达式不支持转义引号。
非常感谢你的帮助。
- 瓦迪姆
答案 0 :(得分:2)
你可以在这样的正则表达式上使用替换:
~::~(?=(?:[^"]*"[^"]*")*[^"]*"[^"]*$)
这可能有点难以理解,但它基本上确保你所替换的~::~
之后有奇数引号。
好的,有了转义引号,它有点复杂,因为正则表达式也必须“吃掉”转义的引号。你可以试试这个:
~::~(?=(?:(?:[^\\"]|\\"|\\\\)*"(?:[^\\"]|\\"|\\\\)*")*(?:[^\\"]|\\"|\\\\)*"(?:[^\\"]|\\"|\\\\)*$)
'漂亮的照片!
答案 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 边引用字符串,此处包含额外信用但未在下方演示。
替换为:空字符串
Live Demo在示例中,您对显示输出的“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" ~::~