Как удалить пробелы из захваченного символа подстановки? - PullRequest
1 голос
/ 10 мая 2019

Я пытаюсь изменить некоторые XML с помощью Find & Replace в Notepad ++ с помощью регулярных выражений.

Это конкретный XML, который я пытаюсь захватить:

<category name="Content Server Categories:FOLDER:test category">
    <attribute name="test attribuut"><![CDATA[test]]></attribute>
    <attribute name="test attribuut1"><![CDATA[test1]]></attribute>
</category>

После регулярного выражения 'FIND'выполняет работу (на данный момент):

<(category) name="Content Server Categories:(.+?)">(.+)</(category)>

Теперь мне нужно заменить XML следующим:

<category-FOLDER:testcategory name="Content Server Categories:FOLDER:test category">
    <attribute name="test attribuut"><![CDATA[test]]></attribute>
    <attribute name="test attribuut1"><![CDATA[test1]]></attribute>
</category-FOLDER:testcategory>

В настоящее время я пытался использовать это регулярное выражение 'REPLACE BY':

<($1-$2) name="Content Server Categories:($2)">($3)</($1-$2)>

Но это дает следующий вывод:

<category-FOLDER:test category name="Content Server Categories:FOLDER:test category">
    <attribute name="test attribuut"><![CDATA[test]]></attribute>
    <attribute name="test attribuut1"><![CDATA[test1]]></attribute>
</category-FOLDER:test category>

Как вы видите, я получаю category-FOLDER: тестовая категория вместо category-FOLDER:testcategory

Пробелы должны быть удалены.

Проблема в том, что входные данные могут выглядеть по-другому.Теперь это так:

<category name="Content Server Categories:FOLDER:test category">

Но это также может выглядеть как следующие примеры:

<category name="Content Server Categories:FOLDER1:FOLDER2:test category">

<category name="Content Server Categories:FOLDER NAME:test category">

<category name="Content Server Categories:FOLDER NAME: FOLDER NAME1:test category">

<category name="Content Server Categories:FOLDER:test category name">

...

Как правильно отловить все это и удалить пробелы?

РЕДАКТИРОВАТЬ: Почти забыл,

'. Matches newline' is __ON__

1 Ответ

2 голосов
/ 10 мая 2019

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

Получите требуемую структуру (обратите внимание на использование не жадной версии .*? для предотвращения чрезмерного соответствия):

<(category) name="Content Server Categories:(.+?)">(.+?)</(category)>

Regex demo

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

<$1-$2 name="Content Server Categories:$2">$3</$1-$2>

Затем сопоставьте пробелы, используя повторяющиеся совпадения, используя \G:

(?:</?category-|\G(?!^))\K\s*([\w:]+) (?!name=)

В замене заменить пробелы группой захвата 1 $1

Объяснение

  • (?: Группа без захвата
    • </?category-FOLDER Соответствует тексту с необязательным /
    • | или
    • \G(?!^) Утверждение позиции в конце предыдущего матча
  • ) Закрыть группу без захвата
  • \K\s* Забудьте, что было ранее найдено, и затем сопоставьте 0+ пробельных символов
  • ([\w:]+) Захват в группе 1, соответствующий 1+ раз слово char или:
  • (?!name=) Утверждаем, что справа не является не "имя ="

Regex demo

...