2010-07-21 2 views
9

У меня есть выражение регулярное выражение, которое пересекает строку и вытаскивает 40 значений, это выглядит своего рода, если как запрос ниже, но гораздо больше и более сложнойRegex выражение обратной ссылки более 9 значений в замене

est(.*)/test>test>(.*)<test><test>(.*)test><test>(.*)/test><test>(.*)/test><test>(.*)/test><test(.*)/test><test>(.*)/test><test>(.*)/test><test>(.*)/test><test>(.*)/test><test>(.*)/test><test>(.*)/test><test>(.*)/test><test>(.*)/test><test>(.*)/test> 

Мой вопрос заключается в том, как использовать эти выражения с командой replace, когда число превышает 9. Кажется, что всякий раз, когда я использую \10, он возвращает значение для \1, а затем добавляет 0 в конец.

Любая помощь была бы оценена спасибо :)

Также я использую UEStudio, но если другая программа не делает это лучше, чем не Biggie :)

+5

В Sublime Text, «\ 10» тоже не работает, но «10 долларов США» РАБОТАЕТ. –

ответ

3

Большинство простых Regex двигателей используется редакторами не оснащены для обработки более 10 групп соответствия; это не похоже на UltraEdit. Я просто попробовал Notepad ++, и это не будет равно регулярное выражение с 10 группами.

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

Вот что-то в Python:

import re 

pattern = re.compile('(.)(.)(.)(.)(.)(.)(.)(.)(.)(.)(.)(.)(.)(.)(.)') 
with open('input.txt', 'r') as f: 
    for line in f: 
     m = pattern.match(line) 
     print m.groups() 

Обратите внимание, что Python позволяет обратные ссылки, такие как \20: для того, чтобы иметь обратную ссылку на 2-й группу с последующей буквальным 0, вам нужно использовать \g<2>0, что недвусмысленно.

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

abcdefghijklmnop 
search: (.)(.)(.)(.)(.)(.)(.)(.)(.)(.)(.)(?<name>.)(.) 
note: 1 2 3 4 5 6 7 8 9 10 11 12 13 
value: a b c d e f g h i j k l m 
replace result: 
    \11  k1  i.e.: match 1, then the character "1" 
    ${12} l  most should support this 
    ${name} l  few support named references, but use them where you can. 

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

+2

«Некоторые люди, столкнувшись с проблемой, думают« Я знаю, я буду использовать регулярные выражения ». Теперь у них есть две проблемы». - Jamie Zawinski приведенная выше цитата никогда не казалась такой истиной :( спасибо за помощь :) –

1

Если вы не можете обрабатывать более 9 подгрупп, почему бы не сначала сопоставить группы из 9, а затем цикл и применить регулярные выражения к этим совпадениям?

1. первое совпадение (<test.*/test>)+, а затем для каждого матча подгруппы на <test(.*)/test>.

+0

К сожалению, в моем случае это не сработает, шаблон довольно большой. Однако я ценю предложение. Спасибо :) –

9

Как указано psycho brm: Используйте 10 долларов США вместо \ 10 Я использую блокнот ++, и он работает красиво.

1

Попробуйте использовать названные группы; поэтому вместо десятого:

(.*) 

использование:

(?<group10>.*) 

, а затем с помощью следующей замены строки:

${group10} 

(Это, конечно, в отсутствии лучшего решения с использованием цикла , и помните, что в зависимости от вашей среды могут быть разные синтаксические выражения regex.)

+0

Это работало для меня при использовании соответствия регулярных выражений в nginx, который, похоже, не подходит для сопоставления более 9 групп. Тот же вопрос, что и у ОП, где 10 долларов США интерпретируется как $ 1 + 0. – theChumpus

0

положил $ перед двойной цифровой подгруппой: например. \ 1 \ 2 \ 3 \ 4 \ 5 \ 6 \ 7 \ 8 \ 9 $ 10 Это сработало для меня.

Смежные вопросы