regex für Dezimalzahlen
kEv*
- programmiertechnik
Hallo liebe SELFHTMLer,
ich Neuling auf dem Gebiet regex.
Folgende regex bringt mir z.T. die gewünschten Ergebnisse.
[1]?(?:\d+.?\d*|\d*.?\d+)
als Ergebniss im Programm Expresso findet dieser Pattern in meinem zu durchsuchenden Text folgende Kombinationen.
1
01
100
1.000
10.000
100.000
Was mache ich falsch wenn ich die Dimension der zu suchenden Zahl nicht kenne und beispielsweise auch Zahlen wie
1.000.000
100.000.000
1000.000.000
oder gar noch größer finden möchte?
Ich bin wie gesagt neu bei den regex, somit wäre ich verbunden wenn mir das jemand erklärt wie man sich am besten an einen Suchstring rantatstet.
Nebenher versuch ich mein Glück weiter, vielleicht finde ich die Lösung ja zufällig.
Ich weiß nach nur kurzem lesen das dieses Thema wohl sehr komplex ist.
LG
kev1n
+- ↩︎
Hi,
Was mache ich falsch wenn ich die Dimension der zu suchenden Zahl nicht kenne und beispielsweise auch Zahlen wie
1.000.000
100.000.000
1000.000.000oder gar noch größer finden möchte?
Tim hat hier erst vor ein paar Tagen einen entsprechenden Ansatz
geschrieben. Ob das für dich zutrifft, hängt aber vom zu durchsuchenden Text ab: https://forum.selfhtml.org/?t=177662&m=1170667
Timo
Tim hat hier erst vor ein paar Tagen einen entsprechenden Ansatz
geschrieben.
Es war Tom
Timo
Hallo liebe SELFHTMLer,
das Topic hat schonmal weitergeholfen.
Meine neue regex sieht nun so aus und findet alles was gefunden werden soll.
Leider doch etwas zuviel.
Die Ergebnisse sind gewünscht:
------------------------------
8.752 Kemzen
114 Kolonisationsschiff
32.509 Handelsriese
2.000 Handelsriese
135.000 Handelsriese
1.000 Handelsriese
9.700 Narubu
111.112.222.333.444.117.100 Narubu
700 Violo
300 Narubu
11.000 Narubu
130.020 Bloodhound
19.221 schwerer
879 Finur
309 Fusionator
808 Grandor
5.031 Handelsschiff
337 Invasionseinheit
1.067.841 Narubu
2.192.365 Noulon
52.199 Rettungsschiff
1.105.784 Snatcher
235.796 Violo
1.132 Zemar
Das sollte nicht mehr erkannt werden.
----------------------
01 von
01 von
117 von
01 von
01 von
01 von
01 von
01 von
...
5 Anfragen
5 Anfragen
2 Anfragen
1 Anfrage
1 Anfrage
1 Anfrage
1 Anfrage
150.21 Millisekunden
43 CEST
2008 by
Hier mal der String der durchsucht wird. (bißchen lang bitte nicht schimpfen)
----------------------------------------
....
1.000 Handelsriese X
5:455:9 auflösen
für Allianz freigeben
kemzen 01 8.752 Kemzen
22:220:6
für Allianz freigeben
koloschiffe 01
114 Kolonisationsschiff X
21:157:21 auflösen
für Allianz freigeben
TRANS *
32.509 Handelsriese X
21:57:2 auflösen
1.000 Handelsriese X
21:57:2 auflösen
für Allianz freigeben
trugar 01 12.800 Trugar
22:220:6
für Allianz freigeben
versorgung 01
25.400 Narubu X
21:157:21 auflösen
für Allianz freigeben
versorgung 02
22.500 Narubu X
21:157:21 auflösen
für Allianz freigeben
versorgung 03
6.500 Narubu X
21:157:21 auflösen
für Allianz freigeben
versorgung 04
9.700 Narubu X
21:157:21 auflösen
für Allianz freigeben
versorgung 05
111.112.222.333.444.117.100 Narubu X
21:157:21 auflösen
für Allianz freigeben
versorgung 06
22.500 Narubu X
21:157:21 auflösen
für Allianz freigeben
versorgung 117
9.900 Narubu X
21:157:21 auflösen
für Allianz freigeben
versorgung 982 800 Narubu
für Allianz freigeben
Flottenverstärkung 9.000 Narubu
00:52:45
für Allianz freigeben
Flottenverstärkung 700 Violo
02:32:13
für Allianz freigeben
Flottenverstärkung 300 Narubu
02:48:20
für Allianz freigeben
Flottenverstärkung 300 Narubu
02:48:21
für Allianz freigeben
Flottenverstärkung 11.000 Narubu
02:48:37
für Allianz freigeben
Flottenverstärkung 400 Narubu
02:48:58
für Allianz freigeben
Flottenverstärkung 1.000 Narubu
06:08:22
für Allianz freigeben
Flottenverstärkung 500 Narubu
06:08:24
für Allianz freigeben
Flottenverstärkung 900 Narubu
06:08:24
für Allianz freigeben
Flottenverstärkung 1.000 Narubu
06:08:24
für Allianz freigeben
Flottenverstärkung 900 Narubu
06:08:24
für Allianz freigeben
Flottenverstärkung 900 Narubu
06:08:24
für Allianz freigeben
Flottenverstärkung 800 Narubu
06:08:35
für Allianz freigeben
bloodhound 01 130.020 Bloodhound
02:52:06
für Allianz freigeben
bomber 01 19.221 schwerer Bomber
02:52:06
für Allianz freigeben
finur 01 879 Finur
02:52:06
für Allianz freigeben
fusionator 01 309 Fusionator
02:52:06
für Allianz freigeben
grandor 01 808 Grandor
02:52:06
für Allianz freigeben
handelsschiffe 01 5.031 Handelsschiff
02:52:06
für Allianz freigeben
invasion 01 337 Invasionseinheit
02:52:06
für Allianz freigeben
narubu 01 1.067.841 Narubu
02:52:06
für Allianz freigeben
neomar 01
02:52:06
für Allianz freigeben
noulon 01 2.192.365 Noulon
02:52:06
für Allianz freigeben
rettungsschiff 01 52.199 Rettungsschiff
02:52:06
für Allianz freigeben
snatcher 01 1.105.784 Snatcher
02:52:06
für Allianz freigeben
violo 01 235.796 Violo
02:52:06
für Allianz freigeben
zemar 01 1.132 Zemar
neues Geschwader erstellen
Zeitrechnung der Erde: 09:20:57 - 28.09.2142
5 Anfragen an Erde
5 Anfragen an Jupiter
2 Anfragen an Kallisto
1 Anfrage an Saturn
1 Anfrage an Rhea
1 Anfrage an Pluto
1 Anfrage an Charon
Ausführungszeit: 150.21 Millisekunden auf Webserver 6.
Version 3.1.0a
Letztes Update: Mon Apr 21 08:00:43 CEST 2008
Copyright © 2005-2008 by Florian Geyer Online-Dienste
----------------------------------------
Sollte ich nun vielleicht doch die Schiffsklassen in ein Array packen und in einer Schleife mein regex zusammenbauen um nur die Anzahl der Schiffe zu bekommen?
Wie würdet ihr das anfassen?
Die Schiffsklassen sind immer bekannt. Nur eben die Zahl davor nicht.
LG
kev1n
Hallo liebe SELFHTMLer,
[0-9,.]+\s\b[a-zA-Z]+
LG
kev1n
11.000 Narubu
130.020 Bloodhound
19.221 schwerer ??????????????
879 Finur
my $re = qr/
[1-9] # beginnt mit 1-9
\d{0,2} # gefolgt von optional weiteren 2 \d
(?:\.\d\d\d)* # gefolgt von beliebig vielen Gruppen von .ddd,
# nicht speichern
\s # gefolgt von genau einem Whitespace
(?! # Negative: Lookahead Assertion:
# schau, dass das folgende NICHT ist
\b # wordboundery
(?:
von
|
Anfragen?
|
CEST
|
Millisekunden?
)
\b # wordboundary
)
[A-Z][A-Za-z]+ # Ein Wort, das mit Grossbuchstaben beginnt
/x;
while( $string =~ /($re)/g){
print $1, "\n";
}
Übersetzung in eine Sprache deiner Wahl ist deine Übung.
mfg Beat
Hallo liebe SELFHTMLer,
vielen Dank für eure Mühen.
Das Thema regex ist doch sehr komplex und das mal eben nebenbei wohl nicht machbar. Somit werde ich wohl nicht um weiteres lesen umhinkommen, um auch in Zukunft vernüftig damit arbeiten zu können.
LG
kev1n
Hallo liebe SELFHTMLer,
so, nun habe ich die gewünschte Regex.
Eine Frage bzw. zwei Fragen diesbezüglich habe ich noch.
Erstmal die regex:
------
(?<shipamount>[1-9][0-9,.]+)\s(?!\b(?:von|Anfragen?|CEST|Millisekunden|by|Florian?)\b)(?<shipclass>(?:[A-Z][a-z]+|[a-z]+\s[A-Z][a-z]+)|(?:[A-Z][a-z]+))|(?<shipclass>[A-Z][a-z]+|[a-z]+\s[A-Z][a-z]+)\s(?<shipamount>[0-9,.]+)\s((?<shipamount>[0-9,.]+))
Dieser Teil intressiert mich sehr und den würde ich gern verbessern.
(?<shipclass>[A-Z][a-z]+|[a-z]+\s[A-Z][a-z]+)\s(?<shipamount>[0-9,.]+)\s((?<shipamount>[0-9,.]+))
Dieser soll nur finden:
schwerer Bomber 0 (12.345)
oder
Snatcher 1.445.555 (765)
Lassen sich nun beim Beispiel Snatcher die Zahlen 1.445.555 und 765 vernünftig gruppieren?
Am besten wäre wenn die regex mir diese beiden Zahlen gleich addiert. Das ist ja aber nicht Aufgabe einer regex, aber das was ich gern erreichen möchte.
Ansonsten bleibt mir nur eine Möglichkeit, der Zahl in klammern eine andere Gruppe zu stecken.
LG
kev1n