Выражение регулярного выражения для обратной ссылки более чем на 9 значений в замене - PullRequest
9 голосов
/ 22 июля 2010

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

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>

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

Любая помощь будеточень признателен спасибо:)

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

Ответы [ 5 ]

10 голосов
/ 28 июня 2013

Как указывает psycho brm : используйте $ 10 вместо \ 10. Я использую notepad ++, и он работает прекрасно.

3 голосов
/ 22 июля 2010

Большинство простых движков 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.

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

1 голос
/ 14 декабря 2016

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

1 голос
/ 02 июня 2016

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

(.*)

используйте:

(?<group10>.*)

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

${group10}

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

1 голос
/ 22 июля 2010

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

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

...