Как правильно сгруппировать в регулярных выражениях? - PullRequest
0 голосов
/ 06 сентября 2011

рассмотрим следующий сценарий

input string = "WIPR.NS"

я должен заменить это на "WIPR2.NS"

Я использую следующую логику.

match pattern =  "(.*)\.NS$"    \\ any string that ends with .NS

replace pattern = "$12.NS"

В вышеприведенном случае, поскольку нет группы с индексом 12, я получаю результат $ 12.NS

Но то, что я хочу, это "WIPR2.NS".

Если у меня нет цифры 2 для замены, она работает во всех других случаях, но не работает для 2.

Как разрешить это дело?

Заранее спасибо, Alok

Ответы [ 2 ]

0 голосов
/ 06 сентября 2011

Вам не нужно ничего делать с тем, что предшествует .NS, поскольку заменяется только то, что сопоставляется.

match pattern = "\.NS$" (любая строка, заканчивающаяся на .NS - donне забудьте экранировать .)
replace pattern = "2.NS"

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

0 голосов
/ 06 сентября 2011

Обычно полностью зависит от вашего движка регулярных выражений (я не знаком с теми, кто использует $1 для представления группы захвата, я больше привык к \1, но у вас возникла бы та же проблема).

Некоторые предоставляют разделитель, который вы можете использовать, например:

replace pattern = "${1}2.NS"

, который ясно указывает на то, что вы хотите захватить группу 1, за которой следует литерал 2.NS.


На самом деле, глядя на эту страницу , кажется, что это в точности способ сделать это (при условии .NET):

Для замены первой обратной ссылкой, за которой сразу следует цифра 9, используйте ${1}9. Если вы введете $19, а обратных ссылок будет меньше 19, $19 будет интерпретирован как буквальный текст и появится в строке результата как таковой.


Также имейте в виду, что Джей дает превосходный ответ для этого конкретного варианта использования, который вообще не требует групп захвата (просто заменив .NS на 2.NS).

Вы можете рассмотреть это как возможность - я оставлю этот ответ здесь, так как:

  • это принятый ответ; и
  • это, вероятно, лучше для более сложных случаев, таких как изменение X([A-Z])4([A-Z]) на X${1}5${2}, где у вас есть переменный текст по обе стороны от бита, который вы хотите изменить.
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...