Informatiker Board (http://www.informatikerboard.de/board/index.php)
- Themengebiete (http://www.informatikerboard.de/board/board.php?boardid=1)
--- Theoretische Informatik (http://www.informatikerboard.de/board/board.php?boardid=5)
---- formale Sprachen (http://www.informatikerboard.de/board/board.php?boardid=12)
----- Reguläre Ausdrücke angeben (http://www.informatikerboard.de/board/thread.php?threadid=2574)


Geschrieben von Schattenklinge am 15.11.2015 um 11:11:

  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



Geschrieben von eulerscheZahl am 15.11.2015 um 12:42:

 

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.



Geschrieben von Schattenklinge am 15.11.2015 um 12:58:

 

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...



Geschrieben von eulerscheZahl am 15.11.2015 um 13:20:

 

^ 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.



Geschrieben von Schattenklinge am 15.11.2015 um 13:29:

 

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))* ?



Geschrieben von eulerscheZahl am 15.11.2015 um 13:32:

 

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



Geschrieben von Schattenklinge am 15.11.2015 um 13:35:

 

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))*



Geschrieben von eulerscheZahl am 15.11.2015 um 13:37:

 

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



Geschrieben von Schattenklinge am 15.11.2015 um 13:56:

 

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?



Geschrieben von eulerscheZahl am 15.11.2015 um 14:01:

 

Kommen erst die a und dann die b, also z.B. aaaaaaaaabbbb, oder können die auch vermischt auftreten?



Geschrieben von Schattenklinge am 15.11.2015 um 14:07:

 

anzahl a mod 3 = 0 oder anzahl b mod 2 = 0
Das wort ist sonst nicht weiter definiert



Geschrieben von eulerscheZahl am 15.11.2015 um 14:25:

 

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.



Geschrieben von Müller am 16.11.2015 um 15:28:

 

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



Geschrieben von eulerscheZahl am 16.11.2015 um 15:48:

 

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


Forensoftware: Burning Board, entwickelt von WoltLab GmbH