2014-09-03 2 views
1

Я хочу удалить все трейлинг-лиги (-) и заменить любые повторяющиеся тире одной тире в противном случае на JavaScript. Я разработал регулярное выражение, чтобы сделать это:Понимание замены с помощью регулярного выражения

"----asdas----asd-as------q---".replace(/^-+()|()-+$|(-)+/g,'$3') 

И это работает:

asdas-asd-as-q 

Но я не понимаю $3 части (полученной через отчаянный эксперимент). Почему не $1?

ответ

3

Вы можете использовать это без каких-либо групп захвата:

"----asdas----asd-as------q---".replace(/^-+|-+$|-+(?=-)/g, ''); 
//=> "asdas-asd-as-q" 

Здесь -+(?=-) является положительный предпросмотр, что делает обязательно совпадает 1 или более дефиса, за исключением в матче последнего -.

+1

+1, но, вероятно, хорошая идея, чтобы кратко объяснить это выражение;) –

+0

Спасибо, я добавил краткое объяснение моему ответу. – anubhava

+0

+1 для гораздо лучшего решения, чем у меня, но точно не отвечает на мой вопрос –

3

Потому что есть 3 группы захвата. (два избыточные пустые и (-)). $3 заменен на строку, соответствующую третьей группе.

Если вы удалите первые две пустые группы захвата, вы можете использовать $1.

"----asdas----asd-as------q---".replace(/^-+|-+$|(-)+/g, '$1') 
// => "asdas-asd-as-q" 
1

$ - формируются группы замены.

См. Демонстрационную версию.

http://regex101.com/r/pP3pN1/25

На правой стороне вы можете увидеть группы порождены().

Заменить и посмотреть. $ 1 пуст в вашем случае.

2

Как говорят другие ответы, $3 указывает третий захваченный подшаблон, т.е. третий набор круглых скобок.

Лично, однако, я хотел бы видеть, что как две операции, и сделать это так:

  1. уравновешивания ведущий и ведомые - сек
  2. Уплотнить дублируют - s

Как так:

"----asdas----asd-as------q---".replace(/^-+|-+$/g,"").replace(/--+/g,"-"); 

Этот вид концепции может быть m ean больше кода, но я считаю, что он намного легче читать и понимать, что здесь происходит, потому что вы делаете одно за раз, а не пытаетесь сделать все сразу.

Смежные вопросы