2

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

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 ... 是示例字母键。

4

1 回答 1

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 的正则表达式

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


编辑:正则表达式的解释

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

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


编辑2:

修复了正则表达式,替换q为您要匹配的标志。

于 2013-06-11T22:04:39.767 回答