Как я могу группировать регулярные выражения после 9-й обратной ссылки?
Хорошо, поэтому я пытаюсь сгруппировать прошлое 9-й обратной ссылки в блокноте ++. Вики говорит, что я могу использовать именование групп, чтобы пройти девятую ссылку. Тем не менее, я не могу заставить синтаксис правильно делать совпадение. Я начинаю с двух групп, чтобы сделать его простым.
Примеры данных
1000,1000
Regex.
(?'a'[0-9]*),([0-9]*)
В соответствии с docs мне нужно сделать следующее.
(?<some name>...), (?'some name'...),(?(some name)...)
Names this group some name.
Однако в результате он не может найти мой текст. Любые предложения?
Ответы
Ответ 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