Объединить смежные "," в один "," и удалить ведущие и конечные ", в одном RegExp

Предположим, что у меня есть строка

",,,a,,,,,b,,c,,,,d,,,,"

Я хочу преобразовать это в

"a,b,c,d"

в 1 RegExp.

Я могу сделать это в двух операциях RegExp, таких как

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

можно ли это сделать в операции 1 RegExp?

Ответ 1

Вы можете использовать регулярное выражение, которое находится в начале или за ним следует запятая или в и, и заменить ее пустой строкой.

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

  • 1-я альтернатива ^,*

    ^ утверждает положение в начале строки

    • ,* соответствует символу , буквально (с учетом регистра)

      * Квантификатор. Совпадает между нулем и неограниченным временем, как можно многократно, при необходимости возвращаясь (жадный)

  • Вторая альтернатива ,+(?=,|$)

    • ,+ соответствует символу , буквально (с учетом регистра)

      + Квантификатор. Совпадает между одним и неограниченным временем как можно дольше, возвращая по мере необходимости (жадный)

    • Положительный Lookahead (?=,|$)

      Утвердите, что Regex ниже соответствует

      • 1-я альтернатива ,

        , соответствует букве буквально (с учетом регистра)

      • Вторая альтернатива $

        $ утверждает положение в конце строки

  • Глобальные флаги шаблонов

    g modifier: g lobal. Все совпадения (не возвращаются после первого совпадения)

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

console.log(string.replace(/^,*|,+(?=,|$)/g, ''));

Ответ 2

Приведенный ниже подход возвращает ожидаемый результат с использованием двух процессов. .match() и шаблонный литерал, который передает инкапсулированное выражение javascript в строку при назначении переменной.

Вы можете использовать String.prototype.match() с RegExp /[^,]+/, чтобы отменить соответствующий запятый символ ,, совместить один или несколько символов, отличных от ,, включая + в RegExp после символьного класса, где , отрицается, чтобы соответствовать "abc", как было предложено @4castle; template literal, чтобы передать результирующий массив в строку.

var str = ",,,a,,,b,,,,c,,,,,,,,d,,,efg,,,";

str = `${str.match(/[^,]+/g)}`;

console.log(str);