((?: \ W) +)
, который идентифицирует 5 подходящих групп. И тогда я мог бы сослаться на него с $ 3 и $ 5
Нет, этоне так, как работают обратные ссылки. В регулярном выражении содержится ровно N групп, а N - это число открывающих скобок.
В ((?:\w)+)
есть 2 группы: одна "захват" (которая создает обратную ссылку) и одна "не захват"(чего нет).
Количество совпадений группы в целевой строке не меняет количество обратных ссылок. Вообразите хаос, который это создаст. За исключением самых упрощенных случаев, как вы узнаете, что вы ищете $3
, $9
или $9000
?
Если ваша входная строка имеет фиксированную структуру, то ваш подходFoo\s*Bar\s*(\w+)\s*Ref\s*(\w+)
с $1
и $2
прекрасно.
Можно ли создать этот вид обратных ссылок без конкретного создания групп захвата вокруг каждой части того, что вы пытаетесьзахватить?
Нет. Вы должны создать одну группу захвата для каждой части, к которой вы пытаетесь обратиться. Если группа совпадает несколько раз, вы получите последний экземпляр каждого совпадения во входных данных.
Некоторые движки регулярных выражений позволяют вам получить доступ к каждому экземпляру того, что определенная группа захватила с основного языка. Например, .NET regex engine делает это . Это хорошо для постобработки, но обратные ссылки сами (т.е. $1
) по-прежнему работают, как указано выше.
Все это, как говорится, способ получить '123445'
и 'ABC1234'
из Foo Bar 123445 Ref ABC1234
в том смысле, в каком вы думали, - избегать регулярных выражений и string.split()
в пространстве, взяв части 2 и 3.