Notepad ++ Синтаксис захвата группы RegeEx - PullRequest
4 голосов
/ 19 ноября 2011

У меня есть список имен меток в текстовом файле, которыми я хотел бы манипулировать с помощью функции «Найти и заменить» в Notepad ++, они перечислены следующим образом:

MyLabel_01
MyLabel_02
MyLabel_03
MyLabel_04
MyLabel_05
MyLabel_06

Я хочу переименовать их в Notepad ++, чтобыследующее:

Label_A_One
Label_A_Two
Label_A_Three
Label_B_One
Label_B_Two
Label_B_Three

Regex, который я использую в диалоге замены Notepad ++ для захвата имени метки, следующий:

((MyLabel_0)((1)|(2)|(3)|(4)|(5)|(6)))

Я хочу заменить каждую группу захвата следующим образом:

\1 = Label_
\2 = A_One
\3 = A_Two
\4 = A_Three
\5 = B_One
\6 = B_Two
\7 = B_Three

Моя проблема в том, что Notepad ++ не регистрирует синтаксис приведенного выше регулярного выражения.Когда я нажимаю кнопку Count в диалоге замены, он возвращается с 0 вхождениями.Не уверен, что в синтаксисе есть ошибки.И да, я убедился, что переключатель «Регулярное выражение» выбран.Помощь приветствуется.

ОБНОВЛЕНИЕ:

Попытка избежать скобки, все еще не работает:

\(\(MyLabel_0\)\((1\)|\(2\)|\(3\)|\(4\)|\(5\)|\(6\)\)\)

Ответы [ 4 ]

5 голосов
/ 20 ноября 2011

Ответ Эд показал рабочий шаблон, поскольку чередование не поддерживается в Notepad ++, однако остальная часть вашей проблемы не может быть решена одним регулярным выражением. То, что вы пытаетесь сделать, невозможно с помощью регулярного выражения поиск / замена. Ваш желаемый результат включает в себя логические условия, которые не могут быть выражены в регулярном выражении. Все, что вы можете сделать с методом замены, это переупорядочить элементы и обратиться к захваченным элементам, но вы не можете сказать ему использовать «A» для значений 1-3 и «B» для 4-6. Кроме того, вы не можете назначать такие заполнители. Это действительно группы, на которые вы ссылаетесь.

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

РЕДАКТИРОВАТЬ: вот пример того, как добиться этого в C #

var numToWordMap = new Dictionary<int, string>();
numToWordMap[1] = "A_One";
numToWordMap[2] = "A_Two";
numToWordMap[3] = "A_Three";
numToWordMap[4] = "B_One";
numToWordMap[5] = "B_Two";
numToWordMap[6] = "B_Three";

string pattern = @"\bMyLabel_(\d+)\b";
string filePath = @"C:\temp.txt";
string[] contents = File.ReadAllLines(filePath);

for (int i = 0; i < contents.Length; i++)
{
    contents[i] = Regex.Replace(contents[i], pattern,
        m =>
        {
            int num = int.Parse(m.Groups[1].Value);
            if (numToWordMap.ContainsKey(num))
            {
                return "Label_" + numToWordMap[num];
            }
            // key not found, use original value
            return m.Value;
        });
}

File.WriteAllLines(filePath, contents);

Вы должны быть в состоянии использовать это легко. Возможно, вы можете загрузить LINQPad или Visual C # Express , чтобы сделать это.

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

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

4 голосов
/ 20 ноября 2011

Bar bar bar - Notepad ++ думает, что вы варвар.

(устарело - см. Обновление ниже.) В нет вертикальных полос в блокноте ++ regex - извините.Я тоже забываю каждые несколько месяцев!

Вместо этого используйте [123456].

Обновление : Извините, я недостаточно внимательно прочитал;В довершение всей проблемы @ Ахмада - вы не можете сделать такую ​​замену сопоставления.

Обновление : 6-я версия Notepad ++ изменила механизм регулярных выражений на Perl-совместимый, который поддерживает "|".AFAICT, если у вас версия 5. , автообновление не будет обновляться до 6. - вы должны явно загрузить его.

0 голосов
/ 07 мая 2013

Регулярное выражение поиска и замены

MyLabel_((01)|(02)|(03)|(04)|(05)|(06))

на

Label_(?2A_One)(?3A_Two)(?4A_Three)(?5B_One)(?6B_Two)(?7B_Three)

работает в Блокноте 6.3.2

Самая внешняя пара скобок предназначена для группировки,они ограничивают область первого чередования;не уверен, могут ли они быть опущены, но включение их проясняет сферу.Шаблон ищет фиксированную строку, за которой следует одна из двузначных пар.(Начальный ноль может быть выделен и помещен в фиксированную строку.) Каждая пара цифр заключена в круглые скобки, поэтому она фиксируется.

В выражении замены в пункте (?4A_Three) говорится, что если группа захвата4 соответствует что-то, затем вставьте текст A_Three, иначе ничего не вставьте.Аналогично для других пунктов.Поскольку 6 альтернатив являются взаимоисключающими, будет соответствовать только один.Таким образом, только одно из (?...) предложений будет соответствовать, и поэтому только один будет вставлять текст.

0 голосов
/ 07 мая 2013

Самый простой способ сделать это, я бы порекомендовал использовать AWK. Если вы работаете в Windows, ищите предварительно скомпилированные двоичные файлы mingw32 для бесплатной загрузки (это будет называться gawk).

BEGIN {
    FS = "_0";
    a[1]="A_One";
    a[2]="A_Two";
    a[3]="A_Three";
    a[4]="B_One";
    a[5]="B_Two";
    a[6]="B_Three";
}

{
    printf("Label_%s\n", a[$2]);
}

Выполнить в Windows следующим образом:

C:\Users\Mydir>gawk -f test.awk awk.in
Label_A_One
Label_A_Two
Label_A_Three
Label_B_One
Label_B_Two
Label_B_Three
...