Toon posts:

[perl] regexp probleempje

Pagina: 1
Acties:

Verwijderd

Topicstarter
ik heb het volgende piepkleine stukje code:
code:
1
2
3
4
5
6
7
8
9
10
11
#!/usr/bin/perl

print "Invoer:";
$invoer = <STDIN>;

if ($invoer == /([a-zA-Z]+)/) {
        print "Correcte invoer!\n";
}
else {
        print "Alleen LETTERS invoeren!\n";
}


Nu ga ik dit uivoeren:
code:
1
2
3
4
5
6
7
8
9
10
11
12
[root@localhost regexp]# ./1.pl
Invoer:aap
Correcte invoer!
[root@localhost regexp]# ./1.pl
Invoer:1
Alleen LETTERS invoeren!
[root@localhost regexp]# ./1.pl
Invoer:1aap
Alleen LETTERS invoeren!
[root@localhost regexp]# ./1.pl
Invoer:aap1
Correcte invoer!


Dit laatste zou naar mijn weten toch niet kunnen kloppen aangezien ik in mijn if statement aangeef dat $input alleen letters mag bevatten :?

iemand die het weet?

Verwijderd

Je geeft volgens mij alleen maar aan, dat er 1 of meer tekens aan het begin van de string moet bestaan uit letters.

  • skiwi
  • Registratie: Februari 2001
  • Laatst online: 05-04 14:13
Perl is lang geleden voor mij maar probeer dit eens:
code:
1
if ($invoer =~ /([a-zA-Z]+)/) {

Dus niet == maar =~
Weet het alleen niet meer zeker.
Correct me if I'm wrong ;)

Verwijderd

Topicstarter
hmmjah

maar als ik
code:
1
if ($invoer == /([a-zA-Z]{2})/) {

verander in
code:
1
if ($invoer == /([a-zA-Z]{2})$/) {


werkt het ook niet :?

Verwijderd

Topicstarter
Verwijderd schreef op 25 oktober 2002 @ 16:05:
hmmjah

maar als ik
code:
1
if ($invoer == /([a-zA-Z]{2})/) {

verander in
code:
1
if ($invoer == /([a-zA-Z]{2})$/) {


werkt het ook niet :?
edit: dit was dus als reply op scooterd bedoeld :)
edit2: argh toen haddik dus gequote ipv geedit :(

Verwijderd

Omdat je aangeeft dat de eerste twee karakters in de string moeten bestaan uit een letter

Verwijderd

Topicstarter
=~ ipv == werkt dus ook niet

Verwijderd

Topicstarter
Verwijderd schreef op 25 oktober 2002 @ 16:07:
Omdat je aangeeft dat de eerste twee karakters in de string moeten bestaan uit een letter
oops je hebt gelijk denk ik
ik d8 dat ik een een + had getypt ipv {2}
lol:D

edit:
code:
1
2
3
maar[root@localhost regexp]# ./1.pl
Invoer:a1
Correcte invoer!

hij doet et dus toch niet

Verwijderd

Ik weet het niet heel erg zeker en kan het ook niet voor je nakijken, maar dit is misschien een gokje waard (misschien dat die 0 een 1 moet zijn):
code:
1
if ($invoer == /([a-zA-Z]{0,n})/) {


edit:
dit gaat te snel... ;)

  • skiwi
  • Registratie: Februari 2001
  • Laatst online: 05-04 14:13
en
code:
1
if ($invoer == /([a-zA-Z]).*/) {

Verwijderd

Topicstarter
skiwi schreef op 25 oktober 2002 @ 16:09:
en
code:
1
if ($invoer == /([a-zA-Z]).*/) {
nope werkt ook niet:)

Verwijderd

Topicstarter
Verwijderd schreef op 25 oktober 2002 @ 16:09:
Ik weet het niet heel erg zeker en kan het ook niet voor je nakijken, maar dit is misschien een gokje waard (misschien dat die 0 een 1 moet zijn):
code:
1
if ($invoer == /([a-zA-Z]{0,n})/) {


edit:
dit gaat te snel... ;)
ook niet :)

  • skiwi
  • Registratie: Februari 2001
  • Laatst online: 05-04 14:13
Goed... volgende mogelijkheid (trial and error). Gejat van een ander forum

code:
1
2
3
4
5
6
7
8
9
10
11
if ($string =~ /^[a-z0-9]+$/i) {
# string is alphanumeric and contains 
# at least 1 character
# if you want to allow empty string, use /^[a-z0-9]*$/i


} else {


# string does not match your criteria
}


Kon je hier echt geen voorbeeld voor vinden? lijkt me een veel voorkomend iets :)

  • Klaus_1250
  • Registratie: December 2000
  • Laatst online: 24-08 19:17
if ($invoer == /([a-zA-Z]+)/) {
print "Correcte invoer!\n";

Dit is wel degelijk correct MUV het volgende. Je zegt hier namelijk: Als je één van deze tekens 1 of meerdere keren vind is de invoer correct. Aap1 is dus correct, want hij vind aap. Die 1 boeit de regexp niet, want hij heeft al gevonden wat je hem vroeg.

Had je dit gedaan:

if ($invoer == /^([a-zA-Z]+)$/) {
print "Correcte invoer!\n";

dan zou die het volgens mij goed moeten doen

[ Voor 0% gewijzigd door Klaus_1250 op 25-10-2002 16:26 . Reden: typo ]


Verwijderd

Topicstarter
Klaus_1250 schreef op 25 oktober 2002 @ 16:25:
if ($invoer == /([a-zA-Z]+)/) {
print "Correcte invoer!\n";

Dit is wel degelijk correct MUV het volgende. Je zegt hier namelijk: Als je één van deze tekens 1 of meerdere keren vind is de invoer correct. Aap1 is dus correct, want hij vind aap. Die 1 boeit de regexp niet, want hij heeft al gevonden wat je hem vroeg.

Had je dit gedaan:

if ($invoer == /^([a-zA-Z]+)$/) {
print "Correcte invoer!\n";

dan zou die het volgens mij goed moeten doen
niet dus ;)

Verwijderd

Topicstarter
skiwi schreef op 25 oktober 2002 @ 16:14:
Goed... volgende mogelijkheid (trial and error). Gejat van een ander forum

code:
1
2
3
4
5
6
7
8
9
10
11
if ($string =~ /^[a-z0-9]+$/i) {
# string is alphanumeric and contains 
# at least 1 character
# if you want to allow empty string, use /^[a-z0-9]*$/i


} else {


# string does not match your criteria
}


Kon je hier echt geen voorbeeld voor vinden? lijkt me een veel voorkomend iets :)
Dit werkt dus ook niet :(

edit: toch wel kleine typo ;)

  • skiwi
  • Registratie: Februari 2001
  • Laatst online: 05-04 14:13
Als ik het goed heb kijk je nu of de string volledig bestaat uit karakters. Maar wat als je het nu eens omdraait? Kijkt of er een cijfer in de string zit! Dat lijkt me handiger te realiseren.

code:
1
2
3
4
5
6
if ($invoer == /([0-9]+)/) {
  print "Geen correcte invoer!\n";
}
else {
  print "Correcte invoer!\n";
}


edit: alhoewel, dan zit je nog wel met ASCII karakters. hmmm...

Verwijderd

Ik ben geen kenner van Perl, maar ik los het meestal als volgt op in PHP: ik tel het aantal karakters in de string en die vul ik in:
code:
1
2
$aantal_karakters = strlen ($invoer);
if ($invoer == /([a-zA-Z]{$aantal_karakters})/) {

Niet echt netjes, maar goed... het doel heiligt de middelen.

  • Rowwan
  • Registratie: November 2000
  • Laatst online: 21:28
'==' is zowiezo al fout... Moet '=~' zijn... :P

Verder:

Probeer eens:
if ($invoer !~ /[0-9]/)

Verwijderd

code:
1
2
3
4
5
6
7
8
9
10
11
#!/usr/bin/perl
#
#
print "Invoer:";
$invoer = <STDIN>;
print $invoer;
if ($invoer =~ /^[a-zA-Z]+$/) {
print "Correcte invoer!\n";
} else {
print "Alleen LETTERS invoeren!\n";
}


Dit werkt wel.

  • skiwi
  • Registratie: Februari 2001
  • Laatst online: 05-04 14:13
Rowwan schreef op 25 oktober 2002 @ 16:33:
'==' is zowiezo al fout... Moet '=~' zijn... :P
ja, dat zei ik in mijn posts hierboven ook al :D
Maar er zijn in Perl toch ook expressies zoals: W en w en D etc. Ik weet alleen niet meer welke waar precies voor wordt gebruikt maar het heeft te maken met het testen van een string op letters en cijfers. Nogmaals: perl is lang geleden voor mij. Kan het anders thuis wel opzoeken mocht je het straks nog niet weten.

  • skiwi
  • Registratie: Februari 2001
  • Laatst online: 05-04 14:13
skiwi schreef op 25 oktober 2002 @ 16:38:
[...]
ja, dat zei ik in mijn posts hierboven ook al :D
Maar er zijn in Perl toch ook expressies zoals: W en w en D etc. Ik weet alleen niet meer welke waar precies voor wordt gebruikt maar het heeft te maken met het testen van een string op letters en cijfers. Nogmaals: perl is lang geleden voor mij. Kan het anders thuis wel opzoeken mocht je het straks nog niet weten.
Hier was ik naar op zoek:
code:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
.   Match any character
\w  Match "word" character (alphanumeric plus "_")
\W  Match non-word character
\s  Match whitespace character
\S  Match non-whitespace character
\d  Match digit character
\D  Match non-digit character
\t  Match tab
\n  Match newline
\r  Match return
\f  Match formfeed
\a  Match alarm (bell, beep, etc)
\e  Match escape
\021  Match octal char ( in this case 21 octal)
\xf0  Match hex char ( in this case f0 hexidecimal)


komt hier vandaan: http://www.troubleshooters.com/codecorn/littperl/perlreg.htm

  • Rowwan
  • Registratie: November 2000
  • Laatst online: 21:28
Ik vindt
code:
1
if ($invoer !~ /[0-9]/)

toch net IETS >:) makkelijker leesbaar dan
code:
1
if ($invoer =~ /^[a-zA-Z]+$/)

  • skiwi
  • Registratie: Februari 2001
  • Laatst online: 05-04 14:13
Ja, maar wat als er in de string ook geen ASCII karakters zoals %^&*() mogen zitten?

  • Rowwan
  • Registratie: November 2000
  • Laatst online: 21:28
Mmmm... misschien (HEEL MISSCHIEN) heb je wel geljk....

  • skiwi
  • Registratie: Februari 2001
  • Laatst online: 05-04 14:13
Rowwan schreef op 25 oktober 2002 @ 16:48:
Mmmm... misschien (HEEL MISSCHIEN) heb je wel geljk....
Hehe, thanks maar daar gaat het mij niet om :p. De topicstarter heeft dit niet helemaal helder gemaakt. Misschien kan hij dat alsnog doen???

  • Klaus_1250
  • Registratie: December 2000
  • Laatst online: 24-08 19:17
Rowwan schreef op 25 oktober 2002 @ 16:43:
Ik vindt
code:
1
if ($invoer !~ /[0-9]/)

toch net IETS >:) makkelijker leesbaar dan
code:
1
if ($invoer =~ /^[a-zA-Z]+$/)
ik vind if ($invoer =~ /^[a-z]+$/i) ook goed leesbaar
Pagina: 1