Regex в Notepad ++ для выбора по длине строки между указанными тегами c XML - PullRequest
0 голосов
/ 02 февраля 2020

Я работаю с данными экстренных служб в NEMSIS XSD. У меня есть поле, которое ограничено только 50 символами. Я много раз искал этот сайт и перепробовал множество решений - Notepad ++ отклоняет их все, говоря, что не найден.

Вот пример XML:

<E09>
        <E09_01>-5</E09_01>
        <E09_02>-5</E09_02>
        <E09_03>-5</E09_03>
        <E09_04>-5</E09_04>
        <E09_05>this one is too long Non-Emergency - PT IS BEING DISCHARGED FROM H AFTER BEING ADMITTED FOR FAILURE TO THRIVE AND ALCOHOL WITHDRAWAL</E09_05>
</E09>
<E09>
        <E09_01>-5</E09_01>
        <E09_02>-5</E09_02>
        <E09_03>-5</E09_03>
        <E09_04>-5</E09_04>
        <E09_05>this one is is okay</E09_05>
</E09>

Я пробовал решения называть тег E09_05 различными способами, используя <\/E09_05> для закрывающего тега, как я видел в некоторых примерах, и просто </E09_05>, как я видел в других. Я пробовал ^.{50,}$ между ними или [a-zA-Z]{50,}$ между ними, я пытался обернуть эти промежуточные выражения в () и без. Я даже попробовал просто [\s\S]*? между тегами. Единственное, что находит Notepad ++, это когда я использую ^.{50,}$ сам по себе без тегов XML ... но потом я получаю удар по всем тегам E13_01 (которые являются описательной частью EMS, и всегда> 50 символов) - создание для кропотливых и ноющих запястий.

Я хотел сделать это XSLT, но слишком много отдельных рук для настройки каждого поля E09_05 для его автоматизации. Perl не подходит в этой среде (и вообще не является инструментом, который я знаю).

Чтобы быть действительно возвышенными, поля E09_05 и E09_08 с длиной строки> 50 должны быть теми, которые выбраны в поиске ... но никаких других элементов любого типа или длины.

Спасибо заблаговременно. Я уверен, что мне просто не хватает какого-то тонкого \, или () или [] где-то ... надеюсь ...

1 Ответ

0 голосов
/ 02 февраля 2020

Следующее регулярное выражение найдет текстовое содержимое <E09_05> элементов с больше , чем 50 символов.

(?<=<E09_05>).{51,}?(?=</E09_05>)

Объяснение

(?<=<E09_05>)     Start matching right after <E09_05>

.{51,}?           Match 51 or more characters (in a single line)
                  The ? makes it reluctant, so it'll stop at first </E09_05>

(?=</E09_05>)     Stop matching right before </E09_05>

Для действительно возвышенного соответствия, то есть полей E09_05 и E09_08 с длиной строки> 50, используйте:

(?<=<(E09_0[58])>).{51,}?(?=</\1>)

Объяснение

<(E09_0[58])>     Match <E09_05> or <E09_08>, and capture the name as group 1

</\1>             Use \1 backreference to match name inside </name>

Если вы хотите сократить текст с помощью многоточия в конце, например, Hello World с максимальной длиной 8 становится Hello..., используйте:

Найти что: (?<=<(E09_0[58])>)(.{47}).{4,}(?=</\1>)
Заменить на: \2...

...