2016-11-07 3 views
0

Ich arbeite an einer Regex, die mir helfen kann, ein Muster in einer Zeichenfolge zu ersetzen.Regex, um eine Kombination von Konstante und Muster zu erhalten

Die Zeichenfolge, die ich im Stream habe, ist sehr lang und nach dem Anwenden der Regex (Finde das Muster und dann durch konstanten Wert ersetzen) muss ich die Zeichenfolge in meinem ETL-Stream weiterleiten.

To find: 
<customer attribute="any number"> 
like <customer attribute="1"> 
and replace with: 
<customer>. (basically just keep "customer" and delete everything) 

Ich bin neu in Regex und lerne es.

Irgendwelche Hilfe !!

+0

'$ str = ~ s/] * attribute =" ([^ \ "] *)" [^>] *>//g; 'Hier kann das Attribut gemischt werden oder mehr als ein Attribut ist möglich Daher verwenden wir '[^>] *'. – ssr1012

+2

Klingt verdächtig, als würden Sie 'XML' mit regulären Ausdrücken analysieren. Wenn ja: Es ist eine schlechte Idee, stattdessen 'XML :: Twig' zu verwenden. (Post einige XML und gewünschte Ausgabe, und ich werde Ihnen ein Beispiel, wie es richtig zu tun) – Sobrique

+0

@ ssr1012 - Not working :( –

Antwort

0

Input:

<consumer attribute=\"1\"><birth-date>1990-07-23</birth-date> </consumer>;

my $element_name = "consumer"; 

my $str = "<consumer attribute=\"1\"><birth-date>1990-07-23</birth-date> </consumer>"; 

$str=~s/<($element_name)[^>]*attribute="[^\"]*"[^>]*>/<$1>/g; 

print $str; 

output:

<consumer><birth-date>1990-07-23</birth-date> </consumer>

+0

Downvoted zum Ermutigen, XML mit Regexes zu analysieren. –

+0

@DaveCross: Haben Sie in einem Beitrag darauf hingewiesen? Ich bin mir sicher, dass ich Regex nicht mit XML-Konvertierungen ermutigt habe. Ich habe gerade die Antwort für Anfragen in Regex weitergeleitet. Genug. Danke für deinen Downvote. – ssr1012

3

Bitte bitte bitte. Don't use regular expressions to parse XML.

Es sind schlechte Nachrichten. Es ist spröde und hacky, und am wichtigsten von allem - völlig unnötig.

Reguläre Ausdrücke behandeln keinen Kontext. Und bei XML dreht sich alles um den Kontext.

XML hat bereits eine Abfragesprache namens xpath, die viel besser geeignet ist.

Hier ist ein Beispiel für finden einen Knoten mit xpath.

#!/usr/bin/env perl 

use strict; 
use warnings; 
use XML::Twig; 

my $twig = XML::Twig -> new -> parsefile ('yourfile.xml'); 

print $twig -> get_xpath('//consumer', 0) -> att('attribute'),"\n"; 

Aber wenn man sie verändern und löschen möchten attribute:

$_ -> del_att('attribute') for $twig -> get_xpath('//consumer[@attribute]'); 
$twig -> set_pretty_print('indented_a'); 
$twig -> print; 

ich aber fragen würde - warum versuchen Sie, das zu tun? Es klingt wie ein weiterer kaputter Prozess irgendwo - vielleicht versucht ein anderes Skript, das XML zu regex?

Aber die andere Sache, die XML::Twig nicht wirklich gut ist es twig_handlers hat, die Sie XML mehr behandeln lassen ordentlich Ströme (zB ohne sie alle in den Speicher zu analysieren, um

Das ist ein bisschen wie das geht.

#!/usr/bin/env perl 

use strict; 
use warnings; 
use XML::Twig; 

sub delete_unwanted { 
    my ($twig, $element) = @_; 
    $element -> del_att('attribute'); 
    #dump progress so far 'out'. 
    $twig -> flush; 
    #free memory already processed. 
    $twig -> purge; 
} 

my $twig = XML::Twig -> new (twig_handlers => { '//consumer[@attribute]' => \&delete_unwanted }); 
    $twig -> parsefile ('your_xml.xml'); 

Wir setzen einen Handler, so dass jedes Mal, wenn der Parser eine consumer mit einem attribute Attribut trifft. (Bad Name, der) es löscht sie, flush es (prints) der analysierten XML und spült es aus dem Speicher. Dies macht es sehr speicher effizient, da Sie nicht das ganze Ding in den Speicher lesen, und kann so ziemlich inline regexing Typ Operationen.

+1

Das OP spricht über einen Stream. Dies wäre ein großartiger Ort, um die Fähigkeit von XML :: Twig, mit Chunked-Daten zu arbeiten, zu bewerben. – simbabque

+1

guter Punkt. Ich füge ein Beispiel hinzu. – Sobrique

+0

@ Sobrique. Zunächst einmal vielen Dank für Ihre Zeit. Du hast den Punkt so gut ausgearbeitet. Aber in meinem Fall benutze ich Penatho Kettle, um meinen ersten XML-Entwurf zu erstellen. Dann wird viel manipuliert und zum Zwecke des Traversierens habe ich "Attribut" hinzugefügt. Endlich muss ich das entfernen. –

Verwandte Themen