PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : wildcard matching



w3rn3r
07-08-2004, 16:32
Hi,

hab 'nen kleines Problem, für welches ich keine wirkliche Lösung finde.

Ich will einfach 2 String vergleichen, wobei einer davon Wildcards (*) enthält.

Was ich will:

'*abc*' soll 'aabcc' 'xabcb' finden
'ab*' soll 'abbcc' 'abc' finden, aber nicht 'ab'
'*ab' soll 'xyzab' finden, aber nicht xyzabc
'a' soll nur a finden, nix anderes



$str =~ s/\*/\\S\*/g;
$str =~ s/\*/\\S\+/g;

Mit beiden klappt das, was ich will nicht.

Ich hatte auch schon versucht, mit


$str =~ s/^\*/\*\\S\*/g;

was anzustellen, aber das ganze erschien mir dann doch relativ komplex.

Gibts da vielleicht 'ne 'bessere' oder simplere Möglichkeit der Lösung?

Danke & MfG

fork
07-08-2004, 16:52
a) man perlre
b) http://txt2regex.sourceforge.net/

w3rn3r
07-08-2004, 17:41
a, kenn ich
b, erfüllt nich ganz dass, was ich will

Mir is schon klar, dass ich für jeden einzelnen Fall den ich im ersten Post aufgefürt hab, 'ne eigene RegExpr schreiben kann.
Nur dachte ich, es gibt _eine_ Möglichkeit, mit der sich das realisieren lässt.

Vielleicht kennt da jemand noch was

MfG

fork
07-08-2004, 18:42
Generell gibt's natuerlich die Moeglichkeit der ODER Verknuepfung:

m/(muster1|muster2|muster3)/
Ansonsten faellt mir noch auf das Du das Zeichen * moeglicherweise falsch Interpretierst. Der steht für 0-unendliche Anzahl von Wiederholung des vorigen Zeichens(und nicht eines beliebigen Zeichens). Ansonsten interessant sind vielleicht noch die folgenden Zusicherungen:

PERLRE(1)
Perl defines the following zero-width assertions:

\b Match a word boundary
\B Match a non-(word boundary)
\A Match only at beginning of string
\Z Match only at end of string, or before newline at the end
\z Match only at end of string
\G Match only at pos() (e.g. at the end-of-match position
of prior m//g)

w3rn3r
09-08-2004, 14:41
Hiho,

dad beispiel da oben hatte ich nur schnell getippt, und nich auf * oder + geachtet.

aber davon mal abgesehen, bin ich zu folgender lösung gekommen:



#!/usr/bin/perl
use strict;
my $n1 = shift @ARGV;
my $n2 = shift @ARGV;
if (!$n1|!$n2) {
die "not enough parameters";
}
$n1 =~ s/^\*/^\\S+/;
$n1 =~ s/\*$/\\S+\$/;
$n1 =~ s/\*/\\S+/g;
$n1 =~ s/([a-z])$/$1\$/;
$n1 =~ s/^([a-z])/^$1/;
if ($n2 =~ /$n1/i) {
print "match!\n";
} else {
print "no match\n";
}


danke für die hilfe ;)

mfg