Как использовать многострочный и упреждающий просмотр вместе в функции поиска Textmate с регулярными выражениями? - PullRequest
1 голос
/ 16 сентября 2010

У меня есть XML-файл, и мне нужно найти все параметры с параметризованным именем аспект (или поле имени с Aspect в качестве значения), найти конец параметра, вставить другой аналогичный параметр, называемый linewidth (см. Ниже для параметр аспекта

  <parameter>
   <parameterid>aspect</parameterid>
   <name>Aspect</name>
   <valuemin>0.1</valuemin>
   <valuemax>5</valuemax>
   <value>1</value>
  </parameter>

Прямо сейчас я могу сделать это с кодом ниже:

(?m:(<name>Aspect<.+?</value>.))(\t+)(</parameter>)

$1$2$3\n$2<parameter>\n$2\t<parameterid>linewidth</parameterid>\n$2\t<name>Line Width</name>\n$2\t<valuemin>0</valuemin>\n$2\t<valuemax>200</valuemax>\n$2\t<value>20</value>\n$2</parameter>

Однако сначала я вставляю все параметры аспекта. Я попытался использовать (?<=, чтобы я мог просто найти местоположение конца параметра аспекта. Но как только я это сделаю, (?m: не работает. Кто-нибудь знает, как заставить их работать вместе? Просто хочу знать.

В идеале, если что-то подобное работает, было бы замечательно:

(?m:(?<=<name>Aspect<.+?</value>.))(\t+)(</parameter>)

Спасибо заранее.

1 Ответ

3 голосов
/ 16 сентября 2010

Попробуйте это регулярное выражение:

(?m:(<name>Aspect<.+?</value>))(\s+)(</parameter>)

(\s+) захватывает как перевод строки, так и пробелы в начале следующей строки, поэтому вы, вероятно, захотите удалить все эти экранированные символы \n и \t из строки замены. Вставленный текст не имеет правильного отступа, но регулярное выражение работает.

...