我在序列化字符串中有一些信号标志,当用户请求某个操作时,我需要从字符串中删除该标志。 我无法找到适用于以下字符串的所有情况的正则表达式。
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 ...是样本字母键。
答案 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
替换为您想要匹配的标记。