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

28

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

Sample Data

1000,1000

Regex.

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

Согласнодокументы Мне нужно сделать следующее.

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

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

В таком случае, почему бы просто не сгенерировать операторы вставки через язык сценариев? user554546
Вовсе нет, я восстанавливаю данные базы данных и использую notepad ++ для форматирования операторов вставки. meanbunny
ой ... 9 обратных ссылок? Вы уверены, что не слишком усложняете что-то? Crayon Violent
Я думаю, что мог бы, но я посетил это ранее с Notepad ++ и попытался пройти 9-ую ссылку и не смог этого сделать. Так что теперь я просто пытаюсь сделать это. meanbunny

Ваш Ответ

3   ответа
32

т. е. 10 долларов - десятая группа.

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

Строка:

abcdefghijklmnopqrstuvwxyz

Regex найти:

(?:a)(b)(c)(d)(e)(f)(g)(h)(i)(j)(k)(l)(m)(n)(o)(p)

Заменить:

$10

Результат:

kqrstuvwxyz

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

Обновление: это все еще работает с v7.5.6

SarcasticSully воскресил это, чтобы задать вопрос:

"What if you want to replace with the 1st group followed by the character '0'?"

Для этого нужно заменить на:

$1\x30

Который заменяет на группу 1 и шестнадцатеричный символ30 - который является0 в ascii.

Error: User Rate Limit Exceeded
Error: User Rate Limit Exceeded
Error: User Rate Limit Exceeded meanbunny
Error: User Rate Limit Exceeded
Error: User Rate Limit ExceededN++ Regex SubstitutionsError: User Rate Limit Exceededdid itError: User Rate Limit Exceeded
3

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

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


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

    {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

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

1

соответствие не проблема, ваш пример соответствует мне в текущем Блокноте ++. Это важный момент.To use PCRE regex in Notepad++, you need a Version >= 6.0.

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

средства

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

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

1000,1001,1000

Но я не знаю, как использовать именованные группы или группы & gt; 9 в строке замены.

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

(?:[0-9]*),([0-9]*),(?:[0-9]*),([0-9]*)
           group 1             group 2
Error: User Rate Limit Exceeded meanbunny

Похожие вопросы