2013-07-02 4 views
2

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

рег:

(\d*)[a-zA-Z]+\d+(?:\.(\d*))*\.[a-zA-Z]+ 

пример

1212asdfasdfdasf101.102.103.asdsadasdasd 

1213asdfasdfdasf104.105.106.asdsadasdasd 

Я хочу, чтобы захватить 102 и 103, 105, 106, а 1212 и 1213 тоже. Как?? Благодаря!

+2

какой язык/окружающая среда/инструмент/аромат regex вы используете это? вы все еще повторяете группу захвата (внешний '*' повторяет '(\ d *)'). если вы не используете .NET, вам нужно обходное решение –

+0

Я использую визуальный базовый 2008, лучший способ, который я нашел, заключался в том, чтобы получить .102.103, как группу захвата, и более позднюю запись другой группы, но только со сценарием «.102.103». Но это два раза с использованием регулярных выражений, может быть, есть форма с одним регулярным выражением – eKeR

+0

, поэтому мы говорим .NET? в этом случае, посмотрите объект 'Group', возвращенный для вашей второй группы захвата. он будет иметь свойство 'Captures', в котором вы можете получить все номера –

ответ

2

Ответ зависит от того, какой язык вы используете.

Для большинства разновидностей регулярных выражений, нет «простой» ответ ... Например, вы можете подумать, вы могли бы сделать что-то вроде этого:

^(?:.*?(\d+))+ 

... Какой бы (вы бы надеяться) создать новую группу захвата для каждой группы цифр.

Однако, если у вас есть быстрый взгляд на (например) java documentation, то вы увидите, что он говорит:

Захват группы пронумерованы путем подсчета их открывающей скобки слева направо

т. Е. Существует фиксированный номер, как указано, сколько пар скобок вы набрали! Таким образом, на большинстве языков вам нужно сделать больше, чем простое совпадение регулярных выражений, чтобы выполнить эту работу.

То есть, если вы не можете сделать свое регулярное выражение менее обобщенным (и гораздо более уродливым), делая что-то ужасное, как:

^(?:.*?(\d+))?(?:.*?(\d+))?(?:.*?(\d+))?(?:.*?(\d+))? 

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

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