Reguläre Ausdrücke angeben

Neue Frage »

Auf diesen Beitrag antworten »
Schattenklinge 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
 
Auf diesen Beitrag antworten »
eulerscheZahl

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.
Auf diesen Beitrag antworten »
Schattenklinge

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...
Auf diesen Beitrag antworten »
eulerscheZahl

^ 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.
 
Auf diesen Beitrag antworten »
Schattenklinge

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))* ?
Auf diesen Beitrag antworten »
eulerscheZahl

+ ist kein ODER, sondern gibt die Anzahl an.
Mit a+b+c findest du also nicht bcb (3 Buchstaben), dafür aber aaaabbbbbbbbc.
Auf diesen Beitrag antworten »
Schattenklinge

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))*
Auf diesen Beitrag antworten »
eulerscheZahl

So passt die Sache.
Reguläre Ausdrücke sind eigentlich standardisiert, ich sehe den Sinn nicht, seine eigene Version zu definieren verwirrt
Auf diesen Beitrag antworten »
Schattenklinge

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?
Auf diesen Beitrag antworten »
eulerscheZahl

Kommen erst die a und dann die b, also z.B. aaaaaaaaabbbb, oder können die auch vermischt auftreten?
Auf diesen Beitrag antworten »
Schattenklinge

anzahl a mod 3 = 0 oder anzahl b mod 2 = 0
Das wort ist sonst nicht weiter definiert
Auf diesen Beitrag antworten »
eulerscheZahl

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.
Auf diesen Beitrag antworten »
Müller

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
Auf diesen Beitrag antworten »
eulerscheZahl

Ist das + jetzt wieder ein ODER?
Wie auch immer, es klappt nicht wie geplant.
Dafür gibt es die "negative look-ahead assertion".
^((?!ab).)*$
 
Neue Frage »
Antworten »


Verwandte Themen

Die Beliebtesten »
Die Größten »
Die Neuesten »