【问题标题】:Regex: match word (but delete commas after OR before)正则表达式:匹配单词(但在 OR 之前删除逗号)
【发布时间】:2011-12-20 05:03:03
【问题描述】:

我试图从用逗号分隔的字符串中删除一个项目:

var str="this,is,unwanted,a,test";

  • 如果我做一个简单的 str.replace('unwanted',''); 我会得到 2 个逗号
  • 如果我做一个更复杂的str.replace('unwanted','').replace(',,',''); 它可能会起作用

但是当str是这样的时候问题就来了:

var str="unwanted,this,is,a,test"; // or "...,unwanted"

但是,我可以做一个 'if char at [0 or str.length] == comma',然后删除它

但我真的认为这不是要走的路,我需要做 2 个替换和 2 个 if 来实现我想要的,这很荒谬

我听说正则表达式可以做很强大的事情,但是我怎么努力都无法理解它

重要提示:

  • 它应该在 OR 之后匹配(不是两者都匹配),否则我们将以 “这个,是,,一个,测试”
  • 逗号之间没有空格

【问题讨论】:

    标签: javascript regex


    【解决方案1】:

    对于这种替换,比正则表达式更易碎的东西怎么样?

    str = str
         .split(',')
         .filter(function(token) { return token !== 'unwanted' })
         .join(',');
    

    jsFiddle.

    但是,如果您确信正则表达式是最好的方法...

    str = str.replace(/(^|,)?unwanted(,|$)?/g, function(all, leading, trailing) {
        return leading && trailing ? ',' : '';
    });
    

    (感谢Logan F. Smyth。)

    jsFiddle.

    【讨论】:

    • 好像挺有意思的,我试试看
    • 第一个函数因“,unwanted,...”而失败(我以“,...”结尾)
    • @TuxedoKnightChess:我不相信它,检查小提琴。
    • (,)? 不需要捕获括号(并且可能只会增加开销)——只需使用 ,? 就可以了。
    • @bobbymcr:然后我将如何在我的函数中引用它们?
    【解决方案2】:

    由于 Alex 没有在他的解决方案中解决这个问题,我想在某个地方获得一个功能齐全的版本。

    var unwanted = 'unwanted';
    var regex = new RegExp('(^|,)' + unwanted + '(,|$)', 'g');
    str = str.replace(regex, function(a, pre, suf) {
      return pre && suf ? ',' : '';
    });
    

    在动态构建正则表达式时唯一需要注意的是,“不需要的”变量中不能有任何可以解释为正则表达式模式的内容。

    正如亚历克斯所说,有一些更简单的方法可以解析这个。除非必须,否则不要使用正则表达式。

    【讨论】:

    • 一般来说,我更喜欢这种类型的正则表达式解决方案,但你不允许像"unwantedzzz,test,unwanted,zzzunwanted,etc"这样的字符串。
    • @nnnnnn 它适用于“,ex,|ex,|,ex”。顺便说一句,您知道如何进行:a)搜索 var 和 b)进行全局搜索。我试过jsfiddle.net/Pg587/1
    • @TuxedoKnightChess 我编辑了我的答案以使用更好的解决方案,就像亚历克斯所拥有的那样,但也考虑到不需要的字符串是单词的一部分。它还进行全局搜索并动态替换。请记住,您需要转义除标准单词字符之外的任何字符。
    猜你喜欢
    • 1970-01-01
    • 2014-03-14
    • 2021-07-31
    • 1970-01-01
    • 1970-01-01
    • 2020-10-18
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多