2016-10-25 9 views
1

РЕДАКТИРОВАТЬрегулярного выражения: заменитель символ в захваченной группе

В регулярном выражении, может комбинационный захват группа быть заменена одной и той же игрой изменены заменяющей символа с другим?

ORIGINAL ВОПРОС

Я преобразования список продуктов в текстовый файл CSV. Каждая строка в списке имеет: number name[ description] price в этом формате:

1 PRODUCT description:120 
2 PRODUCT NAME TWO second description, maybe:80 
3 THIRD PROD:18 


Полученный формат должен включать в себя также слаг- вместо ) в качестве второго поля:

1 PRODUCT:product-1:description:120 
2 PRODUCT NAME TWO:product-name-two-2:second description, maybe:80 
3 THIRD PROD:third-prod-3::18 

Я использую регулярное выражение:

(\d+) ([A-Z ]+?)[ ]?([a-z ,]*):([\d]+)

и замена струна:

`\1 \2:\L$2-\1:\3:\4 

Таким образом, мой результат:

1 PRODUCT:product-1:description:120 
2 PRODUCT NAME TWO:product name two-2:second description, maybe:80 
3 THIRD PROD:third prod-3::18 

, что я скучаю является разделителем дефис - мне нужно во втором поле, то есть группа \2 с ' - 'вместо' '.
Возможно ли это с одним регулярным выражением, или я должен пойти на второй проход?

(на данный момент я использую текстовый редактор Sublime)

Thanx.

+0

Я уверен, вам понадобится еще один раунд регулярного выражения, чтобы решить эту проблему. – Aaron

+0

@Aaron Я тоже начинаю быть уверенным, если вы уверены, добавьте ответ, и я его приму;) –

ответ

0

Я не думаю, что делать это за один проход разумно, и, возможно, это даже невозможно. Чтобы заменить пробелы на дефисы, вам понадобится либо несколько проходов, либо использование непрерывного соответствия, оба потеряют контекст групп захвата, которые вам нужны, чтобы изменить структуру. Поэтому после вашей первой замены я бы поискал (?m)(?:^[^:\n]*:|\G(?!^))[^: \n]*\K и заменил на -. Я не уверен, что Sublime использует многострочный модификатор по умолчанию, тогда вы можете удалить (?m).

Ответ может быть другим, если бы вы использовали язык программирования, который поддерживает функцию обратного вызова для операций замены regex, где вы можете заменить на - внутри этой функции.