Reguläre Ausdrücke angeben |
Schattenklinge unregistriert
|
|
Reguläre Ausdrücke angeben |
|
Hallo, ich bins nochmal,
ich sitze gerade an einer Aufgabe und bin mir unsicher, in meinem skript steht kaum was dazu...
ich soll in der Aufgabe einen regulären Ausdrück über {a,b,c} angeben:
(a) wort w mit wortlänge w % 3 == 0 oder wortlänge w % 2 == 0.
und
(b) wort w mit w enthält nicht die teilfolge ab
Meine Frage dazu ist jetzt: wie gehe ich an solchen aufgaben ran? ich meine ich hätte jetzt bei der a gesagt: (a+b+c)^*, aber das schließt ja nicht alles ein. Ich habe mir auch überlegt, wenn durch 3 teilbar und durch 2 teilbar, dann auch durch 6 teilbar, also müssen es immer 6 buchstaben sein, kann ich das dann einfach durch (a+b+c)^6n beschreiben?
Danke schonmal
|
|
15.11.2015 11:11 |
|
|
|
Das Vielfache von 6 wäre ja Vielfaches von 2 UND Vielfaches von 3.
Überlegen wir uns das Vielfache von 3.
Vielfaches von 3 kriegst du so hin: ^((a|b|c){3})*$
Erst definieren, wie es für genau 3 Buchstaben aussieht. Dann mit dem Stern Vielfache zulassen.
__________________ Syntax Highlighting fürs Board (Link)
|
|
15.11.2015 12:42 |
|
|
Schattenklinge unregistriert
|
|
Hi,
was bedeutet denn dieses ^ vorne dran? Die Schreibweise ist mir nicht bekannt.
((a+b+c)(a+b+c)(a+b+c))* sind 3 buchstaben, durch 3 teilbar, vielfaches von 3 ist da auch drin. jetzt hätte ich gesagt das leere wort noch und ((a+b+c)(a+b+c))*. das erscheint mir aber bisschen einfach...
|
|
15.11.2015 12:58 |
|
|
|
^ ist der Zeilenanfang, $ das Ende. So stelle ich sicher, dass nicht ein Teil des Wortes auf 5 Buchstaben gefunden wird.
Das leere Wort ist schon enthalten, da der Stern auch für 0 mal stehen kann (mindestens einmal wäre +).
Jetzt noch ODER verknüpfen mit 2 Buchstaben, dann bist du fertig mit der a).
Nimm dir einen Texteditor (z.B. notepad++ für Windows oder gedit für Linux), dann kannst du Texte durchsuchen und rumprobieren.
__________________ Syntax Highlighting fürs Board (Link)
|
|
15.11.2015 13:20 |
|
|
Schattenklinge unregistriert
|
|
Hi,
also kann ich das so schreiben wie ich es gerade geschrieben hab?
((a+b+c)(a+b+c)(a+b+c))* + ((a+b+c)(a+b+c))* ?
|
|
15.11.2015 13:29 |
|
|
Schattenklinge unregistriert
|
|
Hi, mit + ist bei uns im skript ein oder gemeint...
Ich kanns auch so schreiben wie du es meinst:
((a|b|c)(a|b|c)(a|b|c))* | ((a|b|c)(a|b|c))*
|
|
15.11.2015 13:35 |
|
|
|
So passt die Sache.
Reguläre Ausdrücke sind eigentlich standardisiert, ich sehe den Sinn nicht, seine eigene Version zu definieren
__________________ Syntax Highlighting fürs Board (Link)
|
|
15.11.2015 13:37 |
|
|
Schattenklinge unregistriert
|
|
Alles klar, danke
nochmal als weitere übung:
und wenn ich jetzt die anzahl der a mod 3 = 0 konstruieren oder anzahl der b mod 2 = 0 konstruieren will, wie mach ich das?
Gehe ich einfach davon aus, dass ich z.B. sowas mache?
Erstmal für mod 3:
(a (b|c)* a (b|c)* a(b|c)*)* ? Dann hab ich immer 3mal a und die Anzahl der a sind immer vielfache von 3?
|
|
15.11.2015 13:56 |
|
|
Schattenklinge unregistriert
|
|
anzahl a mod 3 = 0 oder anzahl b mod 2 = 0
Das wort ist sonst nicht weiter definiert
|
|
15.11.2015 14:07 |
|
|
|
Damit stellst du sicher, dass die Anzahl der a Vielfaches von 3 ist:
^(b|c)*((a(b|c)*){3})*$
Wir haben zu Beginn eine beliebig lange Folge von b und c. Dann kommt drei mal (a, gefolgt von b und c). Diese Gruppe darf aber beliebig oft kommen.
__________________ Syntax Highlighting fürs Board (Link)
|
|
15.11.2015 14:25 |
|
|
Müller unregistriert
|
|
ich komme mit dem Vorschlag für Aufgabe b :
( (b+c)* (a+c)* c (b+c)* ) + ( (b+c)* . (a+b) * )
aber ich bin mir nicht sicher , dass alles abgedeckt ist
|
|
16.11.2015 15:28 |
|
|
|
Ist das + jetzt wieder ein ODER?
Wie auch immer, es klappt nicht wie geplant.
Dafür gibt es die "negative look-ahead assertion".
^((?!ab).)*$
__________________ Syntax Highlighting fürs Board (Link)
|
|
16.11.2015 15:48 |
|
|
|