Notepad ++ Знайти і замінити: Wildcard Змінюючи кількість рядків?


1

У мене складна проблема. Мені потрібно внести незначні зміни у велику кількість файлів XML (500+). Зміна включає перемикання значення з "false" на "true". Рядок, який потрібно змінити, виглядає так:

<SizeIsMeasuredLineLine>false</SizeIsMeasuredLineLine>

І вона повинна стати:

<SizeIsMeasuredLineLine>true</SizeIsMeasuredLineLine>

На жаль, у кожному файлі є безліч екземплярів цього набору тегів, тому ми не можемо зробити простий пошук і заміну. Те, що робить цей набір тегів унікальним, полягає в тому, що вони приходять за рядками після:

<CID>ITEMNAME.BUS.ITEMNAME.DKV</CID>

Однак кожен файл має інше ім'я елемента, тому я використав символи заміни для фільтрації.

<CID>.*BUS..*.DKV</CID>

Проблема полягає в тому, що кількість рядків між частиною CID і лінією, яку потрібно змінити, не узгоджується з файлом у файл. Мені потрібно знайти спосіб, за допомогою якого можна виділити рядки між ними, і замінити рядок Size.

Будь-які ідеї? Я вже намагався:

<CID>.*BUS..*.DKV</CID>.*?<SizeIsMeasuredLineLine>true</SizeIsMeasuredLineLine>

Але чомусь це не спрацювало. Заздалегідь спасибі!

Редагувати у відповідь на коментар:

В основному, я кажу, що код виглядає так:

<CID>ITEMNAME.BUS.ITEMNAME.DKV</CID>
<tag>Some Number of Other lines</tag>
<tag>Some Number of Other lines</tag>
<tag>Some Number of Other lines</tag>
<SizeIsMeasuredLineLine>false</SizeIsMeasuredLineLine>

І інші розділи коду виглядають так:

<CID>ITEMNAME.COLR.ITEMNAME.FCLR</CID>
<tag>Some Number of Other lines</tag>
<tag>Some Number of Other lines</tag>
<tag>Some Number of Other lines</tag>
<SizeIsMeasuredLineLine>false</SizeIsMeasuredLineLine>

в інших місцях коду. Тому я використовую лінію CID .BUS .DKV як відправну точку. В основному мені потрібно змінити першу появу лінії SizeisMeasured, що надходить безпосередньо після лінії CID .BUS .DKV. Але є багато інших ліній між ними (жодна з яких не відповідає файлу файлу), що мене не хвилює, і вони зіпсують мій пошук.


розмістити один (або два) приклад вашого коду pastecode.org і дайте посилання на своє запитання. Це дасть нам кращу ідею
Prasanna

Відповіді:


1

Ви можете скористатися цим негативним виглядом. Пошук

(?!<CID>.*BUS..*.DKV</CID>(.*?))<SizeIsMeasuredLineLine>false</SizeIsMeasuredLineLine>

і замінити

<SizeIsMeasuredLineLine>false</SizeIsMeasuredLineLine>

Регулярний вираз, відповідність. новий рядок

Негативний погляд (?!a) і негативний погляд (?<!a), Також називаються Поглядом. Look Around відповідає символам, але потім відмовляється від матчу, повертаючи тільки результат: матч або не збігається.

Більше можна знайти тут Lookahead і Lookbehind твердження нульової довжини


Дякуємо, але пошук також знаходить інші теги CID, які я не хочу, наприклад: & lt; CID & gt; ITEMNAME.COLR.L1201.FCLR & lt; / CID & gt; Частини .BUS та .DKV дуже важливі для розрізнення потрібної лінії / розділу. Як змінити пошук, щоб він не ігнорував ці частини?
LittleScarfGirl

0

Розбирання XML під час виконання ієрархії з регулярними виразами невиправдано важко. Я б використовував зовсім інший інструмент, який явно призначений для того, що ви намагаєтеся зробити, це перетворення XML. Я говорю про XSLT. Отже, ось моє рішення для вашої проблеми за допомогою XSLT. Існує ряд веб-сайтів, які можна використовувати для перетворення XML з XSLT, або ви можете запустити XSLT локально.

Проблема буде легшою, якщо кожна з ваших груп (CID, за якою йде SizeIsMeasuredLineLine) перебуває в межах одного з батьків, але код, наведений нижче, розглядає перший попередній CID sibling, щоб побачити, яке значення має. Якщо вона має значення, що відповідає регулярному виразу (ITEMNAME. [^.] +. ITEMNAME .. +), воно змінює значення false на true. Всі інші елементи просто копіюються на вихід.

<xsl:stylesheet 
xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
version="1.0">

<xsl:output method="xml" indent="yes"/>

<xsl:template match="node()|@*">
    <xsl:copy>
        <xsl:apply-templates select="node()|@*"/>
    </xsl:copy>
</xsl:template>

<xsl:template match="SizeIsMeasuredLineLine[matches(preceding-sibling::CID[1], 'ITEMNAME\.[^.]+\.ITEMNAME\..+')]">
   <xsl:copy>TRUE</xsl:copy>
</xsl:template>

Ось зразок XML, який я створив для перевірки вищезазначеного:

    <?xml version="1.0" encoding="UTF-8"?>
<parent>
    <CID>ITEMNAME.BUS.ITEMNAME.DKV</CID>
    <tag>Some Number of Other lines</tag>
    <tag>Some Number of Other lines</tag>
    <tag>Some Number of Other lines</tag>
    <SizeIsMeasuredLineLine>false</SizeIsMeasuredLineLine>
    <CID>ITEMNAME.COLR.ITEMNAME.FCLR</CID>
    <tag>Some Number of Other lines</tag>
    <tag>Some Number of Other lines</tag>
    <tag>Some Number of Other lines</tag>
    <SizeIsMeasuredLineLine>false</SizeIsMeasuredLineLine>
    <CID>ITEMNAME.BUS.122.DKV</CID>
    <tag>Some Number of Other lines</tag>
    <tag>Some Number of Other lines</tag>
    <tag>Some Number of Other lines</tag>
    <SizeIsMeasuredLineLine>false</SizeIsMeasuredLineLine>
    <CID>ITEMNAME.COLR.ITEMNAME.FCLR</CID>
    <tag>Some Number of Other lines</tag>
    <tag>Some Number of Other lines</tag>
    <tag>Some Number of Other lines</tag>
    <SizeIsMeasuredLineLine>false</SizeIsMeasuredLineLine>
    <CID>ITEMNAME.BUS.44.DKV</CID>
    <tag>Some Number of Other lines</tag>
    <tag>Some Number of Other lines</tag>
    <tag>Some Number of Other lines</tag>
    <SizeIsMeasuredLineLine>false</SizeIsMeasuredLineLine>
    <CID>ITEMNAME.COLR.ITEMNAME.FCLR</CID>
    <tag>Some Number of Other lines</tag>
    <tag>Some Number of Other lines</tag>
    <tag>Some Number of Other lines</tag>
    <SizeIsMeasuredLineLine>false</SizeIsMeasuredLineLine>
    <CID>ITEMNAME.BUS.33.DKV</CID>
    <tag>Some Number of Other lines</tag>
    <tag>Some Number of Other lines</tag>
    <tag>Some Number of Other lines</tag>
    <SizeIsMeasuredLineLine>false</SizeIsMeasuredLineLine>
    <CID>ITEMNAME.COLR.ITEMNAME.FCLR</CID>
    <tag>Some Number of Other lines</tag>
    <tag>Some Number of Other lines</tag>
    <tag>Some Number of Other lines</tag>
    <SizeIsMeasuredLineLine>false</SizeIsMeasuredLineLine>
</parent>
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.