Schrift
[thread]8613[/thread]

Frage zu regular expressions

Leser: 1


<< >> 6 Einträge, 1 Seite
Disco0101
 2006-12-31 15:01
#72815 #72815
User since
2006-12-31
2 Artikel
BenutzerIn
[default_avatar]
Hallo Leute, ich soll eine Aufgabe lösen, die wie folgt lautet:

Ein regulärer Ausdruck soll einen String mit genau 8 Zeichen matchen, wenn er nur die Zeichen 0 oder 1 enthält, aber nicht nur Nullen!

So und da hab ich das mal probiert und wie folgt geschrieben:

#!perl -w

$a = "0000001111000010000001111110"

if ($a =~ /^(?0{8})[0-1]{8}$/) {print "gematched\n";}


jedoch bekomm ich immer nen Fehler, an der Stelle, wo das ?0 steht...

Ich hoffe mir kann jemand helfen?
topeg
 2006-12-31 15:46
#72816 #72816
User since
2006-07-10
2611 Artikel
BenutzerIn

user image
So wie du versuchst wird es niemals funktionieren. Denn
Dein String ist länger als zweimal acht Zeichen und die Regexp wird niemals matchen.
Wenn du kein übertrag in eine variable möchtest dann mußt du schon "(?:0[8})" schreiben. Aber wenn ich dich richtig verstehe, dann willst du immer nur die ersten acht zeichen haben und nicht die Zeichen 9-16
Wenn dui die zeichen "0" und "1" finden willst schreibe das so: "[01]". "[0-1]" geht zwar auch, ist aber unnötig kompliziert und aufwändig für den Parser.
Dann wäre da noch das fehlende ";". Der Code wird so nie funktionieren. Wenn du die Moodule "strict" und "warnings" benutzen würdest würde er schon da ordentlich mosern.

Du mußt das ganze etwas anders angehen:
Code: (dl )
1
2
3
4
5
6
#!/usr/bin/perl
use strict;
use warnings;
my $a = "0000001111000010000001111110";
if($a=~/^[01]{8}/ and $a!~/^0{8}/)
{ print "gematched\n"; }
Relais
 2006-12-31 15:55
#72817 #72817
User since
2003-08-06
2244 Artikel
ModeratorIn
[Homepage] [default_avatar]
Was möchtest Du denn mit ?0 aussagen? ? an erster Stelle in einer Regex ist ein Fehler, denn es bedeutet "das vorhergegangene Zeichen Null bis einmal" und das geht mangels vorhergegangenem Zeichen an der ersten Stelle nicht.

Code: (dl )
if ( m/[01]{8}/ and m/1/ and not m/[^01]/ ) { print "OK\n" }
Erst denken, dann posten --
26. Deutscher Perl- u. Raku -Workshop 15. bis 17.04.2024 in Frankfurt/M.

Winter is Coming
Disco0101
 2006-12-31 15:57
#72818 #72818
User since
2006-12-31
2 Artikel
BenutzerIn
[default_avatar]
danke für die super Erklärung
renee
 2007-01-01 14:50
#72819 #72819
User since
2003-08-04
14371 Artikel
ModeratorIn
[Homepage] [default_avatar]
@Relais: Wobei Deine Regex auch Strings matcht, die länger als 8 Zeichen sind und nur aus 1 und 0 besteht.

Es müsste eher so aussehen:
Code: (dl )
if ( m/^[01]{8}$/ and m/1/) { print "OK\n" }
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/
Relais
 2007-01-01 17:07
#72820 #72820
User since
2003-08-06
2244 Artikel
ModeratorIn
[Homepage] [default_avatar]
Anhand des längeren Beispiels war ic davon ausgegagen, daß das zuslässig war :-)
Erst denken, dann posten --
26. Deutscher Perl- u. Raku -Workshop 15. bis 17.04.2024 in Frankfurt/M.

Winter is Coming
<< >> 6 Einträge, 1 Seite



View all threads created 2006-12-31 15:01.