Schrift
[thread]10984[/thread]

regulärer ausdruck



<< >> 9 Einträge, 1 Seite
Gast Gast
 2007-12-09 18:10
#103662 #103662
Hallo,

ich möchte eine Zeichenkette auf die korrekte Syntax überprüfen. ich komme jedoch leider nicht drauf wie das richtige Suchmuster dafür aussieht.

die Zeichenkette sieht z.B. so aus

2B3K1/8/3N1p1p/6pk/5P1P/6P1/7r/5r2 w - -

zwischen den slashes dürfen nur die zeichen 1-8pPbBnNrRqQkK vorkommen. Es kommen also erst 8 dieser strings, die jeweils mit einem slash getrennt sind,
dann ein blank,
dann entweder w oder b,
dann wieder ein blank,
dann dürfen nur die Zeichen KkQq oder strich kommen,
dann wieder ein blank,
und dann dürfen nur die Zeichen a-h36 oder ein strich vorkommen. (z.B. d3)

wäre super wenn mir da jemand die syntax für den entsprechenden regulären Ausdruck sagen könnte. Ich glaube ich stehe da irgendwie auf der Leitung.

Gruß,
Armin.
jan
 2007-12-09 18:31
#103664 #103664
User since
2003-08-04
2536 Artikel
ModeratorIn
[Homepage] [default_avatar]
Code (perl): (dl )
1
2
3
4
5
6
7
8
9
#!/usr/bin/perl -w
use strict;

my $string = '2B3K1/8/3N1p1p/6pk/5P1P/6P1/7r/5r2 w - -';

if($string =~ m![1-8pPbBnNrRqQkK]+/[1-8pPbBnNrRqQkK]+/[1-8pPbBnNrRqQkK]+/[1-8pPbBnNrRqQkK]+/[1-8pPbBnNrRqQkK]+/[1-8pPbBnNrRqQkK]+/[1-8pPbBnNrRqQkK]+/[1-8pPbBnNrRqQkK]+ [wb] [-KkQq] [-a-h36]+!)
{
        print "yo";
}


sowas?
Gast Gast
 2007-12-09 19:02
#103665 #103665
Hallo jan,

danke für die schnelle Antwort. Das sieht schon mal soweit gut aus, zumindest besser als meine eigen bisherigen versuche :-) Muss ich noch ein bisschen damit rumtesten.

Mit den Regulären Ausdrücken hab ich immer wieder mal so meine Probleme. Immer wenn ich ein Script schreibe bleib ich meistens an diesem Thema hängen. Muss ich mal sehen ob ich da mal eine gute Dokumentation zu diesem Thema finde. Ist ja immerhin ein essentieller Bestandteil von perl.

Gruß,
Armin.

renee
 2007-12-09 21:16
#103667 #103667
User since
2003-08-04
14371 Artikel
ModeratorIn
[Homepage] [default_avatar]
Das m![1-8pPbBnNrRqQkK]+/[1-8pPbBnNrRqQkK]+/[1-8pPbBnNrRqQkK]+/[1-8pPbBnNrRqQkK]+/[1-8pPbBnNrRqQkK]+/[1-8pPbBnNrRqQkK]+/[1-8pPbBnNrRqQkK]+/[1-8pPbBnNrRqQkK]+ [wb] [-KkQq] [-a-h36]+! kann man auch besser schreiben:

Code (perl): (dl )
m!(?:[1-8pPbBnNrRqQkK]+/){7}[1-8pPbBnNrRqQkK]+ [wb] [-KkQq] [-a-h36]+!


Damit sagt man, dass das [1-8pPbBnNrRqQkK]+/ siebenmal vorkommen muss...
OTRS-Erweiterungen (http://feature-addons.de/)
Frankfurt Perlmongers (http://frankfurt.pm/)
--

Unterlagen OTRS-Workshop 2012: http://otrs.perl-services.de/workshop.html
Perl-Entwicklung: http://perl-services.de/
jan
 2007-12-10 00:15
#103668 #103668
User since
2003-08-04
2536 Artikel
ModeratorIn
[Homepage] [default_avatar]
oh, ja, ich konnte offenbar nicht geradeaus denken...
Dubu
 2007-12-10 00:46
#103669 #103669
User since
2003-08-04
2145 Artikel
ModeratorIn + EditorIn

user image
Den bisher vorgeschlagenen Mustern fehlen die Anker für Stringanfang und -ende. Somit würden beliebige Zeichen am Anfang oder Ende nicht geprüft.
Außerdem würde ich das etwas komplizierte Untermuster abtrennen, da es mehr als einmal benutzt wird.
Code (perl): (dl )
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
#!/usr/bin/perl
use warnings;
use strict;

# Untermuster, Groß-/Kleinschreibung nicht unterschieden
my $submuster = qr/(?i)[1-8pbnrqk]+/;

# Testdaten - nur der erste String ist korrekt!
for my $string (<DATA>) {
    chomp $string;
    if($string =~ m!^(?:$submuster/){7}$submuster [wb] [-KkQq] [-a-h36]+$!) {
        print "$string: ja";
    } else {
        print "$string: nein";
    }
    print "\n";
}
__DATA__
2B3K1/8/3N1p1p/6pk/5P1P/6P1/7r/5r2 w - -
 2/8/Np/6pk/5P1P/6P1/7r/5r2 w - -
/2B3K1/8/3N1p1p/6pk/5P1P/6P1/7r/5r2 w - -
2B3Y1/8/3N1p1p/6pk/5P1P/6P1/7r/5r2 w - -
2B3K1/8/3N1p1p/6pk/5P1P/6P1/7r/5r2 W - -
2B3K1/8/3N1p1p/6pk/5P1P/6P1/7r/5r2 - -
2B3K1/8/3N1p1p/5P1P/6P1/7r/5r2 w - -
2B3K1/8/8/3N1p1p/6pk/5P1P/6P1/7r/5r2 w - -
2B3K1/8/8/8/3N1p1p/6pk/5P1P/6P1/7r/5r2 w - -


Code: (dl )
1
2
3
4
5
6
7
8
9
10
$ perl match.pl
2B3K1/8/3N1p1p/6pk/5P1P/6P1/7r/5r2 w - -: ja
2/8/Np/6pk/5P1P/6P1/7r/5r2 w - -: nein
/2B3K1/8/3N1p1p/6pk/5P1P/6P1/7r/5r2 w - -: nein
2B3Y1/8/3N1p1p/6pk/5P1P/6P1/7r/5r2 w - -: nein
2B3K1/8/3N1p1p/6pk/5P1P/6P1/7r/5r2 W - -: nein
2B3K1/8/3N1p1p/6pk/5P1P/6P1/7r/5r2 - -: nein
2B3K1/8/3N1p1p/5P1P/6P1/7r/5r2 w - -: nein
2B3K1/8/8/3N1p1p/6pk/5P1P/6P1/7r/5r2 w - -: nein
2B3K1/8/8/8/3N1p1p/6pk/5P1P/6P1/7r/5r2 w - -: nein
Gast Gast
 2007-12-10 00:53
#103671 #103671
Hallo,

jetzt habe ich noch mal eine Frage dazu. Irgendwie funktioniert das noch nicht ganz so wie ich das möchte. zur Vereinfachung habe ich nur mal einen string genommen:

if ($string !~ m/[1-8pPbBnNrRqQkK]+/) {print "Fehler";}

wenn jetzt string z.B xyz ist wird der Ausdruck Fehler gewertet. soweit so gut.
wenn jedoch der string z.B. Byz ist, wird er als gut gewertet. Das ist jedoch schlecht. Im string dürfen nur Zeichen vorkommen die in den Eckigen Klammern stehen. Die Auswertung wird jedoch scheinbar beim vorkommen eines richtigen Zeichens abgebrochen.

Irgendwie werde ich daraus nicht so ganz schlau. Ich glaube um reguläre Ausdrücke verstehen zu können benötigt man ein Informatik Studium ;-)

LG,
Armin.
jan
 2007-12-10 04:48
#103672 #103672
User since
2003-08-04
2536 Artikel
ModeratorIn
[Homepage] [default_avatar]
dubu hat's wunderschön gemacht.

mit deinem test
Code (perl): (dl )
if ($string !~ m/[1-8pPbBnNrRqQkK]+/) {print "Fehler";}


prüfst du nun nur, ob nicht (!~) ein oder mehrere zeichen aus der menge [1-8pPbBnNrRqQkK] vorkommen. das passt natürlich, sobald der string Byz ist, weil dann ja ein B drin ist.

für diesen fall müsstest du's also umdrehen:
Code (perl): (dl )
if ($string =~ m/[^1-8pPbBnNrRqQkK]/) {print "Fehler";}


es sei denn, ich stehe vollkommen auf dem holzweg, was, in anbetracht der uhrzeit, nicht unwahrscheinlich ist.

allerdings: wenn du den ganzen string testen willst, mach's wie dubu es vorgemacht hat. wenn's nur um einen teil davon geht, sollte das so gehen.


wenn ich mich nicht irre, ist [pPbBnNrRqQkK] schneller als [pbnrqk] mit case-insensitivity, oder?
Gast Gast
 2007-12-10 10:03
#103673 #103673
Code (perl): (dl )
if ($string =~ m/[^1-8pPbBnNrRqQkK]/) {print "Fehler";}


vielen Dank, so funktioniert es. Da hatte ich einen Denkfehler drin. hab ich schon wieder was dazu gelernt.

Danke an alle für die guten Beschreibungen. Jetzt versehe ich das auch langsam mit den Regulären Ausdrücken.

LG,
Armin.
<< >> 9 Einträge, 1 Seite



View all threads created 2007-12-09 18:10.