RegExp替换JavaScript中的子字符串

时间:2013-06-11 21:56:04

标签: javascript

我在序列化字符串中有一些信号标志,当用户请求某个操作时,我需要从字符串中删除该标志。 我无法找到适用于以下字符串的所有情况的正则表达式。

var flags = "out:ab,bc,bcc,cd";

这是我最接近的(例如删除bc标志)

flags.replace(/[:,]bc\b/, "");

结果是out:ab,bcc,cd这很酷,但是当删除ab时,我会得到outbc,bcc,cd这是错误的。结果必须始终保持字符串序列化,例如out:flag1,flag2 我尝试捕获子模式,但找不到全面的工作组合。

- 更多信息:

标志是0/1信号,如果有标志,我必须将其删除。

Out:是操作模式,它与In相反:(这是第二组标志)。简单来说,Out:是“允许所有,但黑名单这些”,其中In:是“拒绝所有,但将这些列入白名单”。该应用程序可以在任一模式下运行。 ab,bc,cd ...是样本字母键。

1 个答案:

答案 0 :(得分:2)

使用non-capturing parentheses

var q = ['cd', 'bc'].join('|'),
    re = new RegExp('(?:[:]('+q+'))|(,('+q+')(?=,))|(,('+q+')$)', 'g'),
    flags = "out:ab,bc,bcc,cd";
flags.replace(re, '');
=> "out:ab,bcc"

来自MDN的Regular Expressions

  

(?:x)匹配'x'但不记得匹配。括号称为非捕获括号,并允许您为正则表达式运算符定义子表达式。考虑样本表达式/(?:foo){1,2} /。如果没有非捕获括号,{1,2}字符将仅适用于'foo'中的最后一个'o'。使用捕获括号,{1,2}适用于整个单词'foo'。


编辑:对RegExp的解释

/(?:[:](cd|bc))|(,(cd|bc)(?=,))|(,(cd|bc)$)/g

有三个部分,由管道分隔。 ?:[:](cd|bc)在分号后面显示标记; ,(cd|bc)(?=,)涵盖逗号之间的标记,包括匹配表达式中的前一个逗号; ,(cd|bc)$涵盖字符串末尾的标志,也包括前面的逗号。


编辑2:

修复了RegExp,将q替换为您想要匹配的标记。