将连续的","合并为单个","并在一个RegExp中删除前导和尾随","

mar*_*308 10 javascript regex

假设我有一个字符串

",,,a,,,,,b,,c,,,,d,,,,"
Run Code Online (Sandbox Code Playgroud)

我想把它转换成

"a,b,c,d"
Run Code Online (Sandbox Code Playgroud)

在1次RegExp操作中.

我可以在2个RegExp操作中完成它

var str = ",,,a,,,b,,,,c,,,,,,,,d,,,,,,";
str = str.replace(/,+,/g,",").replace(/^,*|,*$/g, '');
Run Code Online (Sandbox Code Playgroud)

是否可以在1次RegExp操作中执行此操作?

Nin*_*olz 13

您可以使用正则表达式,它们在开头或后跟逗号或在和,并用空字符串替换它.

/^,*|,(?=,|$)/g

  • 第一选择 ^,*

    ^ 断言字符串开头的位置

    • ,*,字面匹配字符(区分大小写)

      * 量词 - 在零和无限次之间匹配,尽可能多次,根据需要回馈(贪婪)

  • 第二种选择 ,+(?=,|$)

    • ,+,字面匹配字符(区分大小写)

      + 量词 - 在一次和无限次之间匹配,尽可能多次,根据需要回馈(贪婪)

    • 积极前瞻 (?=,|$)

      断言下面的正则表达式匹配

      • 第一选择 ,

        , 匹配字符,字面意思(区分大小写)

      • 第二种选择 $

        $ 断言字符串末尾的位置

  • 全局模式标志

    g modifier:g lobal.所有比赛(首场比赛后不返回)

var string =  ",,,a,,,,,b,,c,,,,d,,,,";

console.log(string.replace(/^,*|,+(?=,|$)/g, ''));
Run Code Online (Sandbox Code Playgroud)

  • 为了使替换操作的数量更有效,您可以使用[`^,*|,+(?=,| $)`](https://regex101.com/r/Tpav18/2) (2认同)
  • 我把它优化为`/ ^,+ |,+(?![^,])/ g` (2认同)