Che regex sarebbe partita una tabella nidificata con testo identificabile nella cella della tabella?

StackOverflow https://stackoverflow.com/questions/1505277

  •  19-09-2019
  •  | 
  •  

Domanda

Cosa regex dovrebbe corrispondere una tabella nidificata con testo identificabile nella cella della tabella? Ho provato ma non è riuscito a venire con un'espressione regolare per estrarre la tabella specifica che voglio con fuori afferrando l'inizio e la fine di entrambe le tabelle nell'esempio. Ecco qualcosa per iniziare: "<table>.*?</table>"

<table>
    <tr>
        <td>
            <table>
                <tr><td>Code1</td></tr>
                <tr><td>some data</td></tr>
                <tr><td>etc ...</td></tr>
            </table>
        </td>
    </tr>
    <tr>
        <td>
            <table>
                <tr><td>Code2</td></tr>
                <tr><td>some data</td></tr>
                <tr><td>etc ...</td></tr>
            </table>
        </td>
    </tr>
</table>

dire che voglio per estrarre la tabella contenente "Code2". Cosa regex corrisponderà specificamente e solo quel tavolo?

È stato utile?

Soluzione

La seguente espressione regolare troverà la vostra tavola:

(?ms)<table>((?!<table>).)*<td>Code2</td>.*?</table>

Con (?ms) si accende "le partite multilinea" (m) e "punto corrisponde a capo, troppo" (s). Allora avete un (?!) lookahead negativo per assicurarsi che non avete seconda partenza di un tavolo all'interno della vostra partita.

Altri suggerimenti

Non vorrei usare un'espressione regolare su questo, dal momento che HTML non è regolare, e non ci sono fine casi limite per far scattare in su. È meglio utilizzare un parser HTML. Qualunque sia la lingua o dalla piattaforma che si sta utilizzando, ci sarà una disponibile.

Non utilizzare un'espressione regolare. Utilizzare un parser HTML!

Tuttavia, in Perl (ammesso che non si dispone di tabelle nidificate):

$xml =~ /<table>.*<td>Code2<\/td>.*<\/table>/s;
Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top