Regex frage

  • Themenstarter Themenstarter konstimator
  • Beginndatum Beginndatum
K

konstimator

Gast
huhu, also ich hab informatik in der 12 Klasse und soll folgende aufgabe lösen:
ich soll einen regulären ausdruck erstellen, der NUR die positiven Dezimalzahlen ausgibt. Als Trennzeichen soll der Punkt dienen.

Mein Ansatz is so:
^[+]?[0-9]+.{0-9}+$

is das so korrekt?
 
Was fehlt dir denn deiner Meinung nach? Hast du es mal Unit getested - die Regex dürfte schon mal direkt eine Exception werfen...?
 
Zuletzt bearbeitet von einem Moderator:
nein, ich hab auch kein programm dazu es erscheint mir nur falsch. Wir ham damit erst letzten donnersatg angefangen und ich bin dementsprechend unsicher.

ich dachte es könnte auch z.B. so aussehnen: ^[+]?[0-9]*([0-9]{0-9})?$, so in etwa stands in nem andren Forum
 
Zuletzt bearbeitet:
Probier mal

Java:
	public static void main(String[] args) {
		Pattern p = Pattern.compile("^[+]?[0-9]+.{0-9}+$");
		Matcher m = p.matcher("0.123");
		System.out.println(m.matches());

	}

Das wird eine Exception werfen... Weil du da eine geschweifte Klammer hast die eine eckige sein sollte...

Damit kämen wir zu:
Java:
	public static void main(String[] args) {
		Pattern p = Pattern.compile("^[+]?[0-9]+.[0-9]+$");
		Matcher m = p.matcher("0.123");
		System.out.println(m.matches());

	}

Soweit so gut:

"0.123" => true
"+23.2445" => true
"-0.124" => false

Ist ja schon mal nicht schlecht - aber was passiert bei "123" oder "+123"?

Teste es doch mal. Dann wirst du festellen das in dem Teil "[0-9]+.[0-9]+" noch ein Fehler ist.
 
Zuletzt bearbeitet von einem Moderator:
ich dachte es könnte auch z.B. so aussehnen: ^[+]?[0-9]*([0-9]{0-9})?$, so in etwa stands in nem andren Forum

Und wo ist da dein Dezimalpunkt? 😉 Nicht nur in Foren nach Lösungen suchen - sondern versuche zu verstehn was die Regex macht. Es gibt i.d.R. da auch nie EINE Lösung - sondern meist relativ viele verschieden elegante Regex Ausdrücke für das gleiche "Problem"
 
Du musst den "." escapen (regscapen 😀).

//EDIT
Erst warten

//Edit 2
Hehe
 
Zuletzt bearbeitet:
Ich bin mal so nett: [c]"^[+]?[0-9]*[\\.]?[0-9]+$"[/c] würde schon mal einen Schritt weitergehen - aber z.B. [c]"+.123"[/c] wäre demnach auch richtig. Also jetzt noch ein bisschen Eigeninitiative entwickeln... Gruppierungen dürften dir weiterhelfen.
 
Wie gesagt: Es gibt viele Möglichkeiten... elegante und nicht so elegante. Ich hab nur auf dem aufgebaut was der der Fragesteller schon vorgstellt hat - aber an für sich gebe ich dir recht 🙂
 
is ja schön und gut, aber ihr müsst euch vorstellen, dass ich info nur als nebenfach hab und von //d noch nie was gehört hab. es wäre sehr nett, wenn ihr mir einfach sagen könnt wie die lösung lautet, denn ich hab weder nen programm wo ich schaun kann obs auch funktioniert noch ahnung von was ihr da redet. ich hab 2 schulstunden diese regex und deswegen noch nich sehr viel ahnung. Vll könnt ihr mir da dann ja ma helfen und mir auch son programm empfehlen wo man das kostenlos ausprobieren kann.

Hab noch weitere fragen, wenn ihr zeit habt.
 
Das "Programm" um es auszuprobieren ist oben genannter Code. Alternativ lad dir Kodos - The Python Regex Debugger runter und probier es damit aus.

Also ein bisschen Eigeninitiative wirst du schon aufbringen müssen - die perfekte Lösung für Hausaufgaben werden hier selten abgegeben (aus verschiedenen uten Gründen).

Also - lad dir zumindest Kodos runter und probiere deine Lösungen aus - nachdem du versucht hast unsere bisheirgen Vorschläge zu verstehen.
 
ich kann ja ma aufschreiben, was wir bis jetzt alles hatten:

.=beliebiges Zeichen
\.=Satzende
[1-4]=Menge z.B. 1,2,3,4
[a-z]=Alphabet
[^0-9]= Nagation, also keine Zahlen
-[0-9]= alle negativen Zahlen
^=Zeilenanfang
$=Zeilenende
+=ein-oder mehrmaliges Auftreten
?=null-oder einmaliges Auftreten
*=null-,ein-oder mehrmaliges Auftreten
{}=bestimmte Anzahl z.B. an NAchkommastellen
|=oder

Mehr hatten wir noch nicht, deswegen weiß ich nich was mit Gruppierung und d usw. gemeint is
 
Soll denn "+123" funktionieren?
Mit den was ihr hattet kommst du doch schon gut zurecht:
- entweder 1x oder 0x [+]
- entweder viele oder gar keine Zahlen
- Punkt
- entweder viele oder gar keine Zahlen
 
find ich auch, aber sie will das so haben^^

kann ich hier ne nächste frage reinwerfen?

Wenn ja dann folgendes problem:
das selbe wieder mit dezimalt´zahlen, nur dass diesma auch noch negative zahlen gefunden werden können, sowie statt dem . nen , stehn kann. und es soll auch +.123 oder +,123 gefunden werden
 
Alternativen setzen: z.B. für das + oder - => [c]([+]|[-])?[/c], das Punkt oder Komma krichst du jetzt selber hin, gell?
 
jo ich schau ma. und dann sollte ich noch eine regex erstellen, in der Nur die negativen und positiven ganzen Zahlen ausgegeben werden. als lösung hab ich hier ^[+]?[0-9]+[-][0-9]+?
 
jo ich schau ma. und dann sollte ich noch eine regex erstellen, in der Nur die negativen und positiven ganzen Zahlen ausgegeben werden. als lösung hab ich hier ^[+]?[0-9]+[-][0-9]+?

Das ist schon mal komplett falsch. Räts du nur oder versuchst du ernsthaft etwas von dem mitzunehmen was wir hier schreiben?

Erklär doch mal was deine einzelnen Elemente da tun sollen?

Also

1) Regulärer Ausdruck ? Wikipedia lesen
2) Dein Lösung überdenken
3) Nochmal fragen was dir unklar ist
 
so hab jetzt als Lösung ^[+|-][0-9]*[\\.|\\,]?[0-9]+$

folgendes Problem: es sollen ja nur die dezimalzahlen ausgegeben werden. bei dieser Lösung und der davor funktionieren aber ja auch 123 und +123, also is die Aufgabe noch nicht richtig gelöst.

Und bei diesem kodos check ich gerade nich wie das gehn soll. ich geb oben das zeug ein und unten das was rauskommen soll. aber manchma is es unten dennoch rot und wenn ich dann auf das fragezeichen oben im menü gehe gehts dann doch. Is das so gewollt?
 
Das ist schon mal komplett falsch. Räts du nur oder versuchst du ernsthaft etwas von dem mitzunehmen was wir hier schreiben?

Erklär doch mal was deine einzelnen Elemente da tun sollen?

Also

1) Regulärer Ausdruck ? Wikipedia lesen
2) Dein Lösung überdenken
3) Nochmal fragen was dir unklar ist

ich versuche es natürlich ernsthaft, hab eben erst das mit dem | gelesen also sieht die lösung wie folgt aus:^[-|+]?[0-9]+

oder etwa nicht?
 
Zuletzt bearbeitet:
Geht in die richtige Richtung. Jetzt musst du noch überlegen - ist "+002347" eine gültige Zahl? Sind die führenden Nullen erwüscht/erlaubt?
 
hmm das haben wir nicht deffiniert, sieht komsich aus, und ich hab auch keine ahnung wie das gehen soll wenn ich ehrlich bin, denke mma es muss mit ^ also negation gearbeitet werden

fassy, hast du irgendwie msn oder so, damit ich dich noch ma was fragen kann, das würd schneller gehn
 
Zuletzt bearbeitet:
Ist relativ einfach => [c]^[+|-]?[1-9]\\d*$[/c]

Also
1) ^ = Start
2) [+|-]? = optional entweder ein + oder ein -
3) [1-9] = Eine Zahl zwischen 1 und 9
4) \d* = beliebig viele Zahlen ziwschen 0 und 9
5) $ = Ende

Jetzt überdenk nochmal deine anderen Lösungen und schrieb dir mal alle auf
 
das mit dem \\d* versteh ich nicht so genau und in diesem kodos funktioniert diese regex auch nich. und wenn ich nur 1-9 nehm wir ja die zahl 0 nicht ausgegeben, was is dann mit 1000? also das wird noch weniger stimmen oder?
 
Zuletzt bearbeitet:
\\d* ist in Java und einigen anderen Sprachen das gleiche wie [0-9]*

1000 würde gehn. Die 1 durch die erste Gruppe [1-9] und die drei Nullen durch \\d* bzw [0-9]*

Der gleiche Ausdruck wäre [c]^[+|-]?[1-9][0-9]*$[/c].
 
Womit testest du dein RegEx?
Vermutlich ist das Problem, dass du versuchst
Code:
\\d
irgendwo reinkopieren, wo man den Slash nicht escapen muss. Es heißt eigentlich
Code:
\d
 
so habs jetzt verstanden echt genial das mit dem \d* auch wenn wirs noch nicht hatten^^.

zunächst einmal nen großen Dank für die vielen, schnellen Antworten, aber das Problem is immer noch, dass auch 123 ausgegeben wird und nicht NUR dezimalstellen.
 
wie2 ? was meinst du damit, jedenfalls hab ich doch noch nen fehler entdeckt, da nun nicht mehr die zahlen wie z.B. 0,1 0,2 usw gehn
 
Zuletzt bearbeitet:
Naja, versuche ob auch einstellige Zahlen erkennt werden, wie
Code:
1
,
Code:
2
,
Code:
3
etc.
 
Naja, versuche ob auch einstellige Zahlen erkennt werden, wie
Code:
1
,
Code:
2
,
Code:
3
etc.

nein werden sie jetzt nicht mehr und das is ja auch gut so^^ sollen ja nur noch dezimalstelllen funktionieren, aber jetzt is halt das problem, dass 0,1 0,2 usw nich mehr geht
 
Ok beenden wir das Spielchen 🙂:

Java:
Pattern p = Pattern.compile("^[+]?(?![.,])[0-9]*[.,]?[0-9]+$");

Das sollte passen 😉.

//EDIT
Habs eben erst gelesen, aber wenn auch "+.457" bzw. sowas ".122" funktionieren sollen dann ist die nachfolgende Lösung möglich:

Java:
Pattern p = Pattern.compile("^[+]?[0-9]*[.,]?[0-9]+$");
 
Zuletzt bearbeitet:
versteht wer ws gemeint ist, wenn ich einen regex erstellen soll, der alle zeilen ausgibt, die zeichenketten enthalten, die mehr als ein Dezimaltrennzeichen (Punkt oder Komma) enthalten soll?

is damit zum Beispiel eine IP-Adresse gemient?
 
also ich hab folgenden ansaz:

[+|-]?[1-9][0-9]+[\\,|.]+[0-9]+[\\.|,]+[0-9]+
dann kann man aber lediglich 2 ma nen komma setzen und nich mehr 🙁 und ich denke man soll unbergrenz kommas, bzw. punkte setzen können.
 
Es wurde ja nur nach Punkt und Komma gefragt, also kannst du deinen Regex so aufbauen:
- belibige viele Zeichen, außer Zeilenumbruch
- . oder ,
- belibige viele Zeichen, außer Zeilenumbruch
- . oder ,
- belibige viele Zeichen, außer Zeilenumbruch
 
Hab ich das nicht so gemacht? Gibt es keine Funktion, dass ich nicht ständig weiter meine Zeilen deffinieren muss? Weil in meinem Beispiel kann ich ja nur 111,222,,33.44 z.B. schreiben und wenn ich dann noch ma nen , oder . setz gehts nich mehr weiter, wenn du verstehst was ich meine.:toll:
 
Zuletzt bearbeitet:

Neue Themen


Zurück
Oben