Подтвердить что ты не робот

Как я могу группировать регулярные выражения после 9-й обратной ссылки?

Хорошо, поэтому я пытаюсь сгруппировать прошлое 9-й обратной ссылки в блокноте ++. Вики говорит, что я могу использовать именование групп, чтобы пройти девятую ссылку. Тем не менее, я не могу заставить синтаксис правильно делать совпадение. Я начинаю с двух групп, чтобы сделать его простым.

Примеры данных

1000,1000

Regex.

(?'a'[0-9]*),([0-9]*)

В соответствии с docs мне нужно сделать следующее.

(?<some name>...), (?'some name'...),(?(some name)...)
Names this group some name.

Однако в результате он не может найти мой текст. Любые предложения?

4b9b3361

Ответ 1

Вы можете просто ссылаться на группы > 9 так же, как те < 10

i.e $10 - десятая группа.

Для (наивного) примера:

Строка:

АБВГДЕЖЗИКЛМНОПРСТУФХЧШЭЮЯ

Найти выражение:

(?: а) (б) (в) (г) (е) (е) (ж) (з) (I) (к) (к) (л) (м) (п) (о) (р)

Заменить

$10

Результат:

kqrstuvwxyz

Мой тест был выполнен в Notepad ++ v6.1.2 и дал ожидаемый результат.

Ответ 2

Очень запоздалый ответ, чтобы помочь другим, кто приземляется здесь от Google (как и я). Именованные обратные ссылки в замещениях заметок ++ выглядят следующим образом: $+{name}. По какой-то причине.

Здесь есть отклонение от стандартного регулярного выражения, хотя... названным backreferences также присваиваются номера. В стандартном регулярном выражении, если у вас есть (.*)(?<name> & )(.*), вы замените его на $1${name}$2, чтобы получить ту же самую строку, с которой вы начали. В блокноте ++ вы должны использовать $1$+{name}$3.


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

    {CDDB12FE-885F-4FB7-9724-1A4279573DE5}.Dev|Any CPU.ActiveCfg = Debug|Any CPU
    {CDDB12FE-885F-4FB7-9724-1A4279573DE5}.Dev|Any CPU.Build.0 = Debug|Any CPU
    {CDDB12FE-885F-4FB7-9724-1A4279573DE5}.Dev|x64.ActiveCfg = Debug|Any CPU
    {CDDB12FE-885F-4FB7-9724-1A4279573DE5}.Dev|x64.Build.0 = Debug|Any CPU
    {CDDB12FE-885F-4FB7-9724-1A4279573DE5}.Dev|x86.ActiveCfg = Debug|Any CPU
    {CDDB12FE-885F-4FB7-9724-1A4279573DE5}.Dev|x86.Build.0 = Debug|Any CPU
    {CDDB12FE-885F-4FB7-9724-1A4279573DE5}.QA|Any CPU.ActiveCfg = Release|Any CPU
    {CDDB12FE-885F-4FB7-9724-1A4279573DE5}.QA|Any CPU.Build.0 = Release|Any CPU
    {CDDB12FE-885F-4FB7-9724-1A4279573DE5}.QA|x64.ActiveCfg = Release|Any CPU
    {CDDB12FE-885F-4FB7-9724-1A4279573DE5}.QA|x64.Build.0 = Release|Any CPU
    {CDDB12FE-885F-4FB7-9724-1A4279573DE5}.QA|x86.ActiveCfg = Release|Any CPU
    {CDDB12FE-885F-4FB7-9724-1A4279573DE5}.QA|x86.Build.0 = Release|Any CPU


Мой поиск RegEx:

  ^(\s*\{[^}]*\}\.)(?<config>[a-zA-Z0-9]+\|[a-zA-Z0-9 ]+)*(\..+=\s*)(.*)$

Моя замена RegEx:

  $1$+{config}$3$+{config}

Результат:

    {CDDB12FE-885F-4FB7-9724-1A4279573DE5}.Dev|Any CPU.ActiveCfg = Dev|Any CPU
    {CDDB12FE-885F-4FB7-9724-1A4279573DE5}.Dev|Any CPU.Build.0 = Dev|Any CPU
    {CDDB12FE-885F-4FB7-9724-1A4279573DE5}.Dev|x64.ActiveCfg = Dev|x64
    {CDDB12FE-885F-4FB7-9724-1A4279573DE5}.Dev|x64.Build.0 = Dev|x64
    {CDDB12FE-885F-4FB7-9724-1A4279573DE5}.Dev|x86.ActiveCfg = Dev|x86
    {CDDB12FE-885F-4FB7-9724-1A4279573DE5}.Dev|x86.Build.0 = Dev|x86
    {CDDB12FE-885F-4FB7-9724-1A4279573DE5}.QA|Any CPU.ActiveCfg = QA|Any CPU
    {CDDB12FE-885F-4FB7-9724-1A4279573DE5}.QA|Any CPU.Build.0 = QA|Any CPU
    {CDDB12FE-885F-4FB7-9724-1A4279573DE5}.QA|x64.ActiveCfg = QA|x64
    {CDDB12FE-885F-4FB7-9724-1A4279573DE5}.QA|x64.Build.0 = QA|x64
    {CDDB12FE-885F-4FB7-9724-1A4279573DE5}.QA|x86.ActiveCfg = QA|x86
    {CDDB12FE-885F-4FB7-9724-1A4279573DE5}.QA|x86.Build.0 = QA|x86

Надеюсь, это поможет кому-то.

Ответ 3

ОК, сопоставление не проблема, ваш пример соответствует мне в текущем Notepad ++. Это важный момент. Чтобы использовать регулярное выражение PCRE в Notepad ++, вам нужна версия >= 6.0.

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

означает

(?'a'[0-9]*),([0-9]*),\g{a}

будет соответствовать

1000,1001,1000

Но я не знаю способ использования названных групп или групп > 9 в заменяющей строке.

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

(?:[0-9]*),([0-9]*),(?:[0-9]*),([0-9]*)
           group 1             group 2