Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/390.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/regex/17.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
在javascript中移除或替换模式内的子字符串_Javascript_Regex - Fatal编程技术网

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

在javascript中移除或替换模式内的子字符串,javascript,regex,Javascript,Regex,我需要在Javascript中使用regexp的帮助。我正在寻找一种方法来替换子字符串~:~,仅当它位于引号内时。我的情况如下: 源字符串: "aa\"aa\"aa"~::~ "bbb~::~bbb" "ccc" ~::~ ^^^^ sub string to remove 所需字符串:“aa\”aa\”aa“~:::~”bbbbbb“ccc”~::~ 示例代码: var str =' "aa\"aa\

我需要在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,'');
var str=''aa\'aa\'aa'~::::~“bbb~:~bbb”“ccc~::';

var re=/(“”。*?\1/g;使用替换回调,基本上可以将一个替换嵌套在另一个替换中:

str = str.replace(/"[^"\\]*(?:\\.[^"\\]*)*"/g, function(m) {
          return m[0].replace(/~::~/g, "");
      });
第一个模式匹配一个双引号字符串,该字符串允许以模式的形式转义引号(以及转义的任何内容)

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

或者,如果您的引号始终匹配,则要删除的
~:~
后面总是跟有奇数个


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

您可以在正则表达式上使用替换,如下所示:

~::~(?=(?:[^"]*"[^"]*")*[^"]*"[^"]*$)
这可能有点难以理解,但它基本上确保要替换的
~::
后面有奇数个引号

好的,对于转义引号,它有点复杂,因为正则表达式也必须“吃”转义引号。您可以尝试以下方法:

~::(?=(?:(?:[^\\“]\\\\”)*“(?:[^\\”]\\\“\\\”)*”(?:[^\\”]\\\\“\\\\”)*”(?:[^\\”]\\\\“\\\)*((?:[^\\”]\\\\\\\”)*$)

这些照片真漂亮

说明 与其像您的示例中那样捕获单个带引号的子字符串,不如在一个操作中执行此操作,在忽略其他字符串的同时替换有问题的字符串

这些表述将:

  • 忽略转义引号,如
    “此处引用了某些\”文本“
  • 查找所需的
    ~::~
    ,它们位于引用部分的内部或外部,匹配由特定表达式确定
  • 假设输入字符串已经有正确平衡的引号
请注意,唯一的区别在于正向或负向前瞻

正则表达式:
~:::(?!(?:\\“\[^\\”])*(?:”(?:\\“\[^\”)*){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" ~::~
更换后

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

或 如果您确实希望捕获带引号的字符串,同时忽略转义引号,那么:

“(?:\\”|[^”])*”

例子 示例文本

~::~ 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"

不要让模式变得过于复杂。要获得引用的部分,只需使用
“[^”]*”
;)你想换什么?只要
~::~
,或任何非字母字符,或其他什么?@m.buettner::)你说得对@Patrick Evans:是的,模式~:~正是我需要替换的。另一个我刚开始错过的复杂性,我刚刚发现:字符串中可能有转义引号(\”)。事实上,它是一个JSON值部分(“键”:…)。抱歉,我没有指出这一点。因此,我自己的正则表达式是错误的。非常感谢Jerry。对于我提供的示例,它可以很好地工作。但是我忘了提到转义引号也是可能的。对此我深表歉意。@vadimk编辑了答案。@Jerry注意,这并不是转义的原因。例如,
“abc\\”
是有效字符串(而且你的模式不会接受结尾的引号。@vadimk嗨!嗯,我只是用小提琴测试了一下,但是当我把
var str=''aa\'aa\'aa\'aa~:::::,“/bbb”“ccc”“::”;
然后
警报(str);
,它删除了所有的反斜杠。这是否意味着实际的变量有
var str=''aa\\\'aa\\\\\'aa~::::::::“:::,,
ccc~“~::~';相反?@Jerry:你好,Jerry。让我澄清一下:在JSON.parse/JSON.stringify之后,字符串将如下:“{”foo:“aaa\”bbb\“ccc::::~ddd”}”我想从字符串中删除~::~但保留它,例如“{”foo:[{…},~::{…}}”“非常感谢m.buetter。对于我提供的示例,您的模式运行得很好。但是我在上面的评论中提到,我忘了,转义的引用也是可能的。对此我深表歉意。@vadimk编辑了第一个解决方案。第二个解决方案需要更多的转义时间。@vadimk也修复了第二个解决方案。我使用“aaa”测试了您的第二个解决方案。”“bbb”“ccc~::~ccc”“ddd”~:::“eee””。它删除了所有~::~,我需要保留这些,它们不是带引号的字符串。如果我遗漏了什么,请告诉我。谢谢你的“函数”"示例。我从未见过以这种方式开发的regexp!@vadimk抱歉,我忘了将前瞻锚定到字符串的末尾。不过我建议使用第一个版本,因为它比第二个版本可读性更强,因此更易于维护。您好。非常感谢您的回答。清晰详细的解释和检查给我留下了深刻的印象现在我选择了另一个解决方案,但我想我是否可以将这种风格应用到我的其他项目中。再次,非常感谢!