Blocco note ++ Trova e sostituisci: carattere jolly Varia il numero di righe?


1

Ho un problema difficile. Devo apportare una piccola modifica a un gran numero di file xml (500+). La modifica comporta la commutazione di un valore da "falso" a "vero". La linea che deve cambiare appare così:

<SizeIsMeasuredLineLine>false</SizeIsMeasuredLineLine>

E deve diventare:

<SizeIsMeasuredLineLine>true</SizeIsMeasuredLineLine>

Sfortunatamente ci sono numerose istanze di questo set di tag in ogni file, quindi non possiamo fare una semplice ricerca e sostituzione. La cosa che rende unico questo set di tag è che seguono alcune righe:

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

Tuttavia, ogni file ha un nome di elemento diverso, quindi avevo usato i caratteri jolly per filtrarli.

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

Il problema è che il numero di linee tra la parte CID e la linea che deve essere modificata non è coerente da un file all'altro. Devo trovare un modo per jolly le linee intermedie e sostituire la linea di dimensioni.

Qualche idea? Ho già provato:

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

Ma per qualche ragione che non ha funzionato. Grazie in anticipo!

Modifica in risposta al commento:

Fondamentalmente quello che sto dicendo è che il codice è simile al seguente:

<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>

E le altre sezioni del codice sembrano:

<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>

in altri punti del codice. Quindi sto usando la linea CID .BUS .DKV come punto di partenza. Fondamentalmente ho bisogno di cambiare la prima occorrenza della linea SizeisMeasured che arriva direttamente DOPO la linea CID .BUS .DKV. Ma ci sono molte altre linee in mezzo (nessuna delle quali è coerente da un file all'altro) di cui non mi interessa e che stanno rovinando la mia ricerca.


pubblica uno (o due) esempi del tuo codice in pastecode.org e dai un link alla tua domanda. Questo ci darà un'idea migliore
Prasanna,

Risposte:


1

Puoi usare lookahead negativo come questo. Ricerca

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

e sostituisci con

<SizeIsMeasuredLineLine>false</SizeIsMeasuredLineLine>

Espressione regolare, corrispondenza. nuova linea

Lookahead negativo (?!a)e Lookbehind negativo (?<!a), sono anche indicati come Lookaround. Il lookaround abbina i personaggi, ma poi abbandona il match, restituendo solo il risultato: match o no match.

Puoi trovare altro qui Lookahead e Lookbehind Zero-Length Assertions


Grazie, ma quella ricerca trova anche altri tag CID che non voglio, come: <CID> ITEMNAME.COLR.L1201.FCLR </CID> Le porzioni .BUS e .DKV sono molto importanti per distinguere la linea / sezione Ho bisogno. Come posso modificare la ricerca in modo che non ignori quelle parti?
LittleScarfGirl

0

Analizzare XML mentre onorare l'erarchia con le espressioni regolari è inutilmente difficile. Vorrei utilizzare uno strumento completamente diverso che è esplicitamente progettato per quello che stai cercando di fare, che è trasformare XML. Sto parlando di XSLT. Quindi, ecco la mia soluzione per il tuo problema usando XSLT. Esistono numerosi siti Web che è possibile utilizzare per convertire il proprio XML con XSLT o che è possibile eseguire XSLT localmente.

Il problema sarebbe più semplice se ciascuno dei tuoi gruppi (CID seguito da SizeIsMeasuredLineLine) fosse all'interno di un singolo genitore, ma il codice seguente esamina il primo fratello CID precedente per vedere quale valore ha. Se ha un valore corrispondente all'espressione regolare (ITEMNAME. [^.] +. ITEMNAME .. +), cambia il falso in vero. Tutti gli altri elementi vengono semplicemente copiati nell'output.

<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>

Ecco il codice XML di esempio che ho creato per testare quanto sopra:

    <?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>
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.