Regex Zeichenkette in Zeichenklasse
basti123
- programmiertechnik
0 Hugo Egon Balder0 dedlfix0 unknown0 Gunnar Bittersmann0 dedlfix
Hallo!
Wie bekomme ich es hin, dass ich mittels Regex prüfen kann, ob die Zeichenkette diesen Ansprüchen genügt?
Es dürfen nur Buchstaben, groß und klein, enthalten sein und die Zeichenkette '%2f'.
Ich habe das hier [1]*$ , aber die Zeichenkette da jetzt unterzubringen finde ich keinen Weg, da ja die Zeichen als Einzelzeichen interpretiert werden. Auch eine Klammerung, wie hier, klappt nicht [2]*$
Was ist mein Fehler?
Danke,
Basti
Hi basti123,
Es dürfen nur Buchstaben, groß und klein, enthalten sein und die Zeichenkette '%2f'.
Also mit folgender Expression müsste das zB. gehen:
~[1]|(%2f)+$~
Das bedeutet: Entweder ein Buchstabe (groß oder klein) _oder_ die Zeichenkette '%2f', und das Ganze _midestens_ 1 mal. (Beachte, dass da noch keine Umlaute dabei sind!)
Ein Tip: Sehr gut erklärt werden reguläre Ausdrücke in diesem REGEX Turorial.
Mit freundlichen Grüßen
Hugo Egon Balder
a-zA-Z ↩︎
Also mit folgender Expression müsste das zB. gehen:
~[1]|(%2f)+$~
Hm, das würde aber bedeuten, dass %2f am Ende vorkommen muss.
Es soll aber überall möglich sein. Am Anfang, zwischen den Zeichen und am Ende.
Und http://gskinner.com/RegExr/ gibt bei einem '*' (statt dem '+') nach '(%2f)' einen Fehler. Bzw. wird die Zeile rot markiert.
Danke
a-zA-Z ↩︎
Tach!
~[1]|(%2f)+$~
Hm, das würde aber bedeuten, dass %2f am Ende vorkommen muss.
Falsch! Weil der Ausdruck 'a ODER b - mindestens 1 mal' bedeutet _nicht_, dass b am Ende stehen muss.
Die Alternation | trennt den Ausdruck in zwei alternative Teil-Muster. Anfang ^ und Ende $ reihen sich in das jeweilige Teil-Muster mit ein und wirken nicht auf den gesamten Ausdruck. Deshalb ist dein "Falsch!" falsch.
dedlfix.
a-zA-Z ↩︎
Hi dedlfix,
danke für den Fehlerhinweis! Ich war der Meinung, zumindest die Basics von regulären Ausdrücken verstanden zu haben, aber wenn
Die Alternation | trennt den Ausdruck in zwei alternative Teil-Muster. Anfang ^ und Ende $ reihen sich in das jeweilige Teil-Muster mit ein und wirken nicht auf den gesamten Ausdruck
der Fall ist, dann stehe ich wieder am Anfang und habe _nichts_ kapiert. =(
Das habe ich so erklärt noch nirgends gesehen. Und je mehr ich mich grade damit beschäftige, umso mehr wird mir umklar. Jetzt heule ich dann gleich.
Lassen wir mal das ^ und das $ weg. Wieso bitte ist beim Regex ~[a-zA-Z(%2f)]+~ ein %1 ein Treffer? Der Suchausdruck bedeutet doch (in meinem Verständnis): Ein Treffer ist es, sobald mindestens 1 Mal ENTWEDER ein Kleinbuchstabe ODER ein Großbuchstabe ODER die Zeichengruppe %2f gefunden wird. (Laut meinem Verständnis wäre also ein % alleine noch kein Treffer!) Wo ist da mein Fehler?
Mit freundlichen Grüßen
Hugo Egon Balder
Tach!
Wieso bitte ist beim Regex ~[a-zA-Z(%2f)]+~ ein %1 ein Treffer?
(, %, und ) haben in der Zeichenklasse keine Bedeutung und stehen für sich selbst. Damit stehen ebenso die 2 und das f für sich selbst. Letzteres ist überflüssig, weil bereits in a-z enthalten.
Der Suchausdruck bedeutet doch (in meinem Verständnis): Ein Treffer ist es, sobald mindestens 1 Mal ENTWEDER ein Kleinbuchstabe ODER ein Großbuchstabe ODER die Zeichengruppe %2f gefunden wird.
Ein Zeichen wird gefunden, wenn es mit irgendeinem in der Zeichenklasse übereinstimmt. Wenn da ein Entweder in der Zeichenklassen-Logik wäre, dann würde f auf [f] passen, nicht aber auf [ff]. Entweder wirkt ja ausschließend und sowohl 0 XOR 0 und 1 XOR 1 ergäben false. ([fe] wäre 1 XOR 0 und [ef] wäre 0 XOR 1, beides true.)
Laut meinem Verständnis wäre also ein % alleine noch kein Treffer!
Doch, weil es innerhalb der Zeichenklasse einzeln betrachtet wird.
dedlfix.
Hi dedlfix,
Wieso bitte ist beim Regex ~[a-zA-Z(%2f)]+~ ein %1 ein Treffer?
(, %, und ) haben in der Zeichenklasse keine Bedeutung und stehen für sich selbst. Damit stehen ebenso die 2 und das f für sich selbst. Letzteres ist überflüssig, weil bereits in a-z enthalten.
das verstehe ich einfach nicht. Die runden Klammern machen mir doch eine "Gruppe"?! Das bedeutet doch in meinem verständnis, dass bei der Gruppe ' %2f ' ein einzelnes Prozentzeichen oder ein einzelnes f keinen Treffer ergeben würde, sondern dass eben nur die Kombination aller 3, so, als ob es sich um ein Zeichen handeln würde, zu einem Treffer führen.
Nicht? Oder anders gefragt: Was bitte ist denn dann sonst der Unterschied zwischen dem Suchmuster ~abcd~ und ~a(bcd)~ ? Und wie würde ich dann nach abc (als Ganzes!) ODER def für einen Treffer suchen? Nach meinem bisherigen Verständnis mit ~(abc)|(def)~ , aber das ist offenbar falsch. =(
Mit freundlichen Grüßen
Hugo Egon Balder
Om nah hoo pez nyeetz, Hugo Egon Balder!
das verstehe ich einfach nicht. Die runden Klammern machen mir doch eine "Gruppe"?!
aber nicht innerhalb von [ ]
Matthias
Tach!
Wieso bitte ist beim Regex ~[a-zA-Z(%2f)]+~ ein %1 ein Treffer?
(, %, und ) haben in der Zeichenklasse keine Bedeutung und stehen für sich selbst. Damit stehen ebenso die 2 und das f für sich selbst. Letzteres ist überflüssig, weil bereits in a-z enthalten.
das verstehe ich einfach nicht. Die runden Klammern machen mir doch eine "Gruppe"?!
Nochmal: Die eckigen Klammern machen eine Zeichenklasse. In dieser gelten die runden Klammern nicht als Gruppe.
Was bitte ist denn dann sonst der Unterschied zwischen dem Suchmuster ~abcd~ und ~a(bcd)~ ?
Andere Baustelle, keine Zeichenklasse.
Und wie würde ich dann nach abc (als Ganzes!) ODER def für einen Treffer suchen? Nach meinem bisherigen Verständnis mit ~(abc)|(def)~ , aber das ist offenbar falsch. =(
Nein, das ist richtig, aber die Klammern sind überflüssig. ~abc|def~ ist dazu gleichwertig.
dedlfix.
Tach!
Also mit folgender Expression müsste das zB. gehen:
~[1]|(%2f)+$~
Das bedeutet: Entweder ein Buchstabe (groß oder klein) _oder_ die Zeichenkette '%2f', und das Ganze _midestens_ 1 mal. (Beachte, dass da noch keine Umlaute dabei sind!)
Nö, das bedeutet: Am Anfang einer der Buchstaben oder am Ende mindestens ein %2f.
fooBar%2fqux passt,
1fooBar%2fqux passt nicht,
foo1Bar%2fqux passt aber,
2342%2f passt auch (ebenso 2342%2f%2f)
Die Klammerung muss die Zeichenkette (nebst dem Oder) mit einschließen.
dedlfix.
a-zA-Z ↩︎
@@Hugo Egon Balder:
nuqneH
Es dürfen nur Buchstaben, groß und klein, enthalten sein und die Zeichenkette '%2f'.
~[1]|(%2f)+$~
[a-zA-Z] steht nicht für „Buchstaben“, sondern nur für einen kleinen Teil davon.
Qapla'
a-zA-Z ↩︎
Tach!
Es dürfen nur Buchstaben, groß und klein, enthalten sein und die Zeichenkette '%2f'.
Also rein logisch nicht "und" sondern "oder".
Ich habe das hier [1]*$ , aber die Zeichenkette da jetzt unterzubringen finde ich keinen Weg, da ja die Zeichen als Einzelzeichen interpretiert werden. Auch eine Klammerung, wie hier, klappt nicht [2]*$
Muss man ja auch nicht da reinstopfen, kann man als Alternative angeben.
dedlfix.
Tach!
Es dürfen nur Buchstaben, groß und klein, enthalten sein und die Zeichenkette '%2f'.
Also rein logisch nicht "und" sondern "oder".
Habe dies auch so probiert: [1]*$
Nur findet er dann auch 'abc%2Xdef' oder auch 'abc%2'
Er soll aber nur matchen, wenn wirklich der Substring '%2f' im kompletten String vorkommt.
Danke
PS: ich teste immer mit http://gskinner.com/RegExr/
a-zA-Z|(%2f) ↩︎
Tach!
Habe dies auch so probiert: [1]*$
In einer Zeichenklasse haben alle Zeichen, die außerhalb eine Sonderbedeutung haben, keine oder eine andere. Der | ist hier ein ganz normales Zeichen. Und ich sag extra noch "nicht reinstopfen".
Er soll aber nur matchen, wenn wirklich der Substring '%2f' im kompletten String vorkommt.
Ja, deswegen alternativ zur Zeichenklasse suchen. Markus** hat eine funktionierende Lösung gezeigt (bei der aber die innere Klammer, das + und der Backslash überflüssig sind).
Deine Beschreibung lässt aber noch Interpretationsspielraum. Wenn das jetzt noch nicht passt, gib doch mal ein paar Beispiele, die gefunden werden sollen und welche, die nicht gefunden werden sollen. Muss mindestens ein %2f enthalten sein oder nicht, muss das irgendwo stehen oder darf es überall, Hauptsache es bleibt am Stück?
dedlfix.
a-zA-Z|(%2f) ↩︎
In einer Zeichenklasse haben alle Zeichen, die außerhalb eine Sonderbedeutung haben, keine oder eine andere. Der | ist hier ein ganz normales Zeichen. Und ich sag extra noch "nicht reinstopfen".
Ups. Dachte, damit nun grade die Alternative gemacht zu haben. Also entweder die Buchstaben oder eben '%2f'. War das in dem Beispiel, auf welches verlinkt war, nicht so angegeben?
Aber wenn ich jetzt so eure Beispiele sehe, weiß ich, wie die Alternative richtig hätte angegeben werden müssen :)
Vielen Dank euch allen!!!
^([a-zA-Z]*(%2f)*)*$
@@basti123:
nuqneH
Es dürfen nur Buchstaben
Was genau heißt Buchstaben für dich?
Für mich sind ä, č, é, ğ, ł auch Buchstaben. א, β, д auch.
In [a-zA-Z] sind nur ganz wenige Buchstaben.
Qapla'
Tach!
Es dürfen nur Buchstaben
Was genau heißt Buchstaben für dich?
Im Zusammenhang mit der Zeichenkette %2f sind wohl nur solche Buchstaben gemeint, die in einer URL(-Pfadangabe) (am )problemlos(esten) verwendet werden können.
dedlfix.
@@dedlfix:
nuqneH
Im Zusammenhang mit der Zeichenkette %2f sind wohl nur solche Buchstaben gemeint, die in einer URL(-Pfadangabe) (am )problemlos(esten) verwendet werden können.
Braucht man das noch oder kann man nicht gleich mit IRIs arbeiten?
Qapla'
Tach!
Im Zusammenhang mit der Zeichenkette %2f sind wohl nur solche Buchstaben gemeint, die in einer URL(-Pfadangabe) (am )problemlos(esten) verwendet werden können.
Braucht man das noch oder kann man nicht gleich mit IRIs arbeiten?
Sollte man vielleicht tun. Problematisch wird es, wenn man seine Zeichenkodierung nicht im Griff hat, oder Systeme mitspielen, die man nicht kontrollieren kann und die ihrerseits ihre Hausaufgaben nicht gemacht haben.
Zudem lesen sich solche %49%52%49%73 nur in solchen Kontexten gut, in denen sie direkt als ebendiese erkannt und in eine lesbare Form gebracht werden können.
Zitiere ich hier die URL/IRI http://wiki.selfhtml.org/wiki/JavaScript/Reservierte_W%C3%B6rter, sieht das einigermaßen doof aus. Schreib ich es als http://wiki.selfhtml.org/wiki/JavaScript/Reservierte_Wörter, hab ich immer noch Bauchschmerzen, dass alle Systeme das richtig handhaben können. Berechtigt oder nicht mehr?
dedlfix.