RegExp替换JavaScript中的子字符串

RegExp replace substring in JavaScript

本文关键字:字符串 替换 JavaScript RegExp      更新时间:2023-09-26

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

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…

使用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'。


Edit: RegExp的解释

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

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


编辑2:

修正了RegExp,将q替换为您想要匹配的标志