2015-02-04 3 views
0

У меня есть входная строка, которая выглядит примерно так:Как повторить группу захвата?

HLI6Ch60000Ch500C0Ch46400Ch30000Ch21888Ch10E79CS07LCU3Ch37880Ch27800Ch16480CS8CA00000000000000000000 

Теперь я не заботиться о той части, которая следует за последнюю букву A, она всегда будет A и ровно 20 числа, которые не имеют никакого используйте для меня. Я, однако, необходимо часть до последней буквы A, а в идеале, мне нужно бы его разделить на два различных захватах, так же, как это:

1: HLI6Ch60000Ch500C0Ch46400Ch30000Ch21888Ch10E79CS07 
2: LCU3Ch37880Ch27800Ch16480CS8C 

Единственный способ определить эти матчи является то, что они заканчиваются символами CS, за которыми следуют два шестнадцатеричных символа. Я думал, что регулярное выражение, как (.+?CS.{2})+ (или (.+?CS[[:xdigit:]]{2})+) будет делать эту работу, но когда попробовал на www.regex101.com, он только фиксирует последнюю группу и дает следующее предупреждение:

Примечания: Повторный захват группа только захват последняя итерация. Поместите группу захвата вокруг повторяющейся группы, чтобы захватить все итерации или использовать не захват группу вместо того, чтобы, если вы не заинтересованы в данных

Что я думал, что говорит о том, что я должен использовать регулярные выражения, как ((.+?CS.{2})+) вместо этого и я имею в виду - Конечно, теперь я получаю два захватывает, но они выглядят следующим образом:

1: HLI6Ch60000Ch500C0Ch46400Ch30000Ch21888Ch10E79CS07LCU3Ch37880Ch27800Ch16480CS8C 
2: LCU3Ch37880Ch27800Ch16480CS8C 

Значение первый из них ... немного больше, чем хотелось бы, чтобы это было. Если это помогает в любом случае, я должен указать, что окончательное регулярное выражение будет частью приложения iOS, поэтому будет использоваться экземпляр класса NSRegularExpression - не уверен, что это полезная информация вообще, просто я знаю, что NSRegularExpression не поддерживает каждую часть мира регулярных выражений.

+0

Просто используйте это: (.?. + CS {2}) (.?. + CS {2}) '', https://regex101.com/r/zD4cO2/1 – streetturtle

ответ

1

Изменить регулярное выражение,

(.+?CS[[:xdigit:]]{2}) 

DEMO

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

+0

Ах, черт возьми, мне очень жаль, я забыл упомянуть, что может быть больше частей HLI6/LCU3 до финала 'A.{20} 'часть, не всегда просто две! – Cellane

+0

@Cellane вы только говорите, что он заканчивается символом '[: xdigit:]] {2}' два xdigit. –

+0

О, правда, я снова не читал. Таким образом, ваш - это то же самое, что и vks ', в этом случае, поддержал и поблагодарил вас за ваше время! Не могу поверить, что я этого не пробовал. – Cellane

1

Это не похоже, вам нужна группа захвата на всех:

(?:(?!CS[0-9A-F]{2}).)+CS[0-9A-F]{2} 

будет соответствовать всем строкам, которые заканчиваются в CS + 2 шестнадцатеричных цифрах.

Протестируйте его live on regex101.com.

Объяснение:

(?:    # Start a group. 
(?!CS[0-9A-F]{2}) # Make sure we can't match CSff here, 
.     # if so, match any character. 
)+     # Do this at least once. 
CS[0-9A-F]{2}  # Then match CSff. 
+0

Это похоже на волшебство, потрясающее - спасибо, это тоже работает. Мне, возможно, придется прибегать к использованию решения vks (хотя ваш, вероятно, быстрее обрабатывать, если я должен угадать?) Из-за его удобочитаемости в случае необходимости корректировки позже. Тем не менее, большое вам спасибо за ваше время! – Cellane

3
(.+?CS.{2}) 

Вы можете использовать direclty this.See demo.Grab группу или захват.

https://regex101.com/r/vD5iH9/68

+0

Эй, большое спасибо! Я ... не могу поверить, что я об этом не думал. Так просто! – Cellane

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