2016-06-02 3 views
1

Ich muss den folgenden Text mit einem regulären Ausdruck in Perl übereinstimmen.Generic Regulärer Ausdruck in Perl für den folgenden Text

PS3XAY3N5SZ4K-XX_5C9F-S801-F04BN01K-00000-00 

Der Ausdruck, die ich geschrieben habe, ist:

(\w+)\-(\w+)\-(\w+)\-(\w+)\-(\w+)\-(\w+) 

Aber ich möchte etwas mehr generisch. Mit generisch, was ich meine, möchte ich eine beliebige Anzahl von Bindestrichen (-) darin haben.

Vielleicht gibt es so etwas wie in Regex, d. H. Wenn ein Zeichen vorhanden ist, dann suchen Sie nach etwas anderem. Kann mir bitte jemand helfen?

Mehr über mein Problem:

AB-ab
abc-MNO-xyz
LMI-jlk-mno-xyz
.
.
.
.
.
.
.
.
.
und so weiter ...!

Ich möchte alle Muster übereinstimmen .. um genauer zu sein mein String (Feel free zu verwenden \ w Da kann ich Großbuchstaben, Kleinbuchstaben, numerische und '_'underscore hier.) Kann als eine Reihe von irgendwelchen betrachtet werden Anzahl der alphanumerischen Teilstrings mit Bindestrich ('-') als Trennzeichen

+0

Wenn alles, was Sie wollen die ganze Zeichenfolge entsprechen, verwenden Sie so etwas wie 'my ($ id) =/([w + -] + _ [\ w -] +) /'. Wenn Sie alle Komponenten benötigen, ohne zu wissen, wie viele es sind, können Sie 'my @parts = split (/ [_-] /, $ id)' machen. – reinierpost

+0

Dies entspricht Strings wie AB-BX- - am Ende –

+0

Das ist einfach zu beheben. – reinierpost

Antwort

1

Sie suchen nach einem Regex mit Quatifikatoren (siehe perldoc perlre - Abschnitt Quantifizierer).

Sie haben mehrere Möglichkeiten:

  • /\w+(?:-\w+)+)/ wird alle zwei Gruppen von \w Zeichen übereinstimmen, wenn durch einen Bindestrich verbunden (-). Zum Beispiel wird AB-CD übereinstimmen. Achten Sie darauf, dass Sie mit \w Groß- und Kleinbuchstaben zusammenfügen, so dass Sie auch ein Wort wie pre-owned als Schlüssel zuordnen.

  • /\w+(?:-\w+){5})/ werden Schlüssel mit genau 6 Gruppen übereinstimmen. Es entspricht dem, das Sie haben

  • /\w+(?:-\w+){5,})/ wird Schlüssel mit 6 Gruppen oder mehr übereinstimmen.

Wenn es mehr als ein Schlüssel in dem Dokument ist, können Sie eine implizite Schleife in der Regex mit der /g Option tun.

#!/usr/bin/env perl 
use strict; 
use warnings; 
use feature qw{say}; 
use Data::Dumper;  

my $text = "some text here PS3XAY3N5SZ4K-XX_5C9F-S801-F04BN01K-00000-00 some text there"; 

my @matches = $text =~ /\w+(?:-\w+)+)/g; 

print Dumper(\@matches); 

Ergebnis:

$VAR1 = [ 
      'PS3XAY3N5SZ4K-XX_5C9F-S801-F04BN01K-00000-00' 
     ]; 
+0

Was ich eigentlich tun muss, ist, die oben erwähnte Zeichenfolge wird in einer großen Textdatei vorhanden sein, die ich extrahieren und in einer Variablen speichern muss. Obwohl ich das Array verwenden und später beitreten kann, aber ich suche nach etwas besserem im regulären Ausdruck nur –

+0

@YatiSawhney Ich habe bearbeitet. Wie auch immer, ich schlage vor, dass Sie Ihre Frage mit mehr Kontext in Bezug auf _what_, _where_ und _how_ bearbeiten, die Sie mit diesem Text übereinstimmen möchten. Ich mache einige Annahmen: z.B. Was ist die Mindestanzahl von Gruppen, die einen Schlüssel bilden? Ich nehme an, ABC-DEF ist zum Beispiel eine gültige Übereinstimmung. – eballes

+0

Danke ich habe es ..! –

0

Wie wäre es mit Split:

my $str = 'PS3XAY3N5SZ4K-XX_5C9F-S801-F04BN01K-00000-00'; 
my @elem = split(/-/, $str); 

bearbeiten nach Kommentare:

#!/usr/bin/perl 
use Data::Dumper; 
use Modern::Perl; 

my $str = 'Text before PS3XAY3N5SZ4K-XX_5C9F-S801-F04BN01K-00000-00 text after'; 
my ($str2) = $str =~ /(\w+(?:-\w+)+)/; 
my @elem = split(/-/, $str2); 
say Dumper\@elem; 

Ausgabe:

$VAR1 = [ 
      'PS3XAY3N5SZ4K', 
      'XX_5C9F', 
      'S801', 
      'F04BN01K', 
      '00000', 
      '00' 
     ]; 
+0

Zeigen Sie es .. a brauchte eine Regex, um die obige Zeichenfolge zu extrahieren, die eine große Textdatei von etwa 10 MB ist Sobald ich es extrahieren kann, kann ich damit umgehen. Es geht um die Extraktion von Strings wie 'PS3XAY3N5SZ4K-XX_5C9F-S801-F04BN01K-00000-00' wie ich in meiner Frage erwähnt habe. –

+1

@YatiSawhney: OK, ich verstehe. Dann benutze eine Kombination der beiden Antworten, die von ebals gefolgt von meinen. – Toto

+0

Vielen Dank ..! :) –