2009-08-24 6 views
2

Ich verwende den C++ tr1 :: regex mit der ECMA Regex-Grammatik. Was ich versuche zu tun ist eine Kopfzeile parsen und Werte zurückgeben, die mit jedem Element in der Kopfzeile verbunden sind.Gibt es eine Möglichkeit, eine Aufnahme beliebig oft in einem Regex zu wiederholen?

Rubrik:

-Testing some text 
-Numbers 1 2 5 
-MoreStuff some more text 
-Numbers 1 10 

Was würde Ich mag es tun alle „-Numbers“ Linien zu finden und jede Zahl in sein eigenes Ergebnis mit einem einzigen regulären Ausdruck bringen. Wie Sie sehen, können die Zeilen "-Numbers" eine beliebige Anzahl von Werten in der Zeile haben. Momentan suche ich nur nach "-Numbers ([\ s0-9] +)" und tokeniere dann dieses Ergebnis. Ich habe mich nur gefragt, ob es eine Möglichkeit gibt, die Ergebnisse in einem einzigen Regex zu finden und zu tokenisieren.

Antwort

2

Nein, gibt es nicht.

0

Ich wollte gerade diese Frage stellen, und ich fand eine Lösung.

Nehmen wir an, Sie haben eine beliebige Anzahl von Wörtern, die Sie erfassen möchten.

"gibt es vier Lichter"

und

"Captain Picard ist die Bombe"

Man könnte denken, dass die Lösung ist:

/((\w+)\s?)+/ 

aber dies wird nur Spiel die gesamte Eingabezeichenfolge und die letzte erfasste Gruppe.

Sie können den Schalter "g" verwenden.

So ein Beispiel in Perl:

use strict; 
use warnings; 

my $str1 = "there are four lights"; 
my $str2 = "captain picard is the bomb"; 

foreach ($str1, $str2) { 
    my @a = ($_ =~ /(\w+)\s?/g); 
    print "captured groups are: " . join("|", @a) . "\n"; 
} 

Ausgang ist:

captured groups are: there|are|four|lights 
captured groups are: captain|picard|is|the|bomb 

So gibt es eine Lösung, wenn die Sprache Ihrer Wahl ein Äquivalent von "g" unterstützt (und ich denke, die meisten tun ...).

Hoffe das hilft jemand, der in der gleichen Position war wie ich!

S

Verwandte Themen