2016-12-12 3 views
2

Ich versuche eine Regex zu erstellen, die nur 2-stellige Ganzzahlen oder Zahlen mit einer Genauigkeit von 2 Dezimalstellen findet.% von einer Regex-Nummerssuche ausschließen

Im Beispiel Zeichenfolge am Boden, möchte ich nur folgendes finden:

21 und 10.50

Mit diesem Ausdruck, 100% erfasst zu werden, zusätzlich zu den Saiten Ich wünsche zu erfassen :

(\d){1,2}(\.?)([0-9]?[0-9]?){1,2}

ich weiß, ich muss irgendwo ^% verwenden, aber ich kann es geht nicht, wo. Irgendwelche Vorschläge werden sehr geschätzt.

Hier ist meine Probe string:

$ 21 pro Stunde verdienen bis zu - Liefern Sie Lebensmittel mit !! Lieferung Fahrer arbeiten, wenn sie wollen und machen gutes Geld, wenn sie es tun.

Alle Bestellungen sind im Voraus bezahlt, einfach abholen und an hungrige Gäste liefern. Kein Warten in der Schlange oder Fummeln mit Quittungen und Prepaid-Karten.

Es ist schnell und einfach zu arbeiten. Fangen Sie heute an.

Jetzt bewerben

Warum wählen?

Mehr Aufträge als jede andere Takeout Plattform

100% unserer Restaurants sind offizielle Partner

Competitive Bezahlung: Per Zuschlag + Meilenzahl + Tipps

Wir garantieren eine Mindeststunden von 10,50 $/Stunde *

erstellen Sie Ihren eigenen Zeitplan & Arbeit die Stunden, die Sie wollen

+0

Sollte es erfassen: 5, 210,50, 10,2, 2,4, 2,50, 10,502? – user31264

+0

Nr. '(\ D) {1,2}' bekommt Zahlen, die 1 oder 2 Stellen lang sind, '(\.?)' Findet eine Dezimalzahl, wenn sie da ist, '([0-9]? [0-9]?) {1,2} 'soll die 2 Zahlen nach dem Komma erhalten. Ich gebe 3 Treffer (21, 10.50 und 100) von dieser Suche zurück. Ich vermassele etwas in meiner Syntax, die das '%' aufnimmt, was genau das ist, was ich nicht erfassen möchte. – Adrian

+0

Ihr erster Satz widerspricht Ihrem zweiten Satz. "Nein" bedeutet, dass keines der gegebenen Beispiele erfasst werden sollte, einschließlich des Beispiels "5". "(\ d) {1,2} bekommt Zahlen, die 1 oder 2 Ziffern lang sind" bedeutet, dass es "5" akzeptiert, weil es 1 Ziffer hat. Also sollte es "5" akzeptieren und warum oder warum nicht? – user31264

Antwort

2

Wortgrenzen in Ihrem regulären Ausdruck geben Ihnen ein bisschen mehr Kontrolle.

Da Wortgrenzen ein wenig streng sind, müssen wir eine OR-Bedingung einführen, um beide Fälle zu adressieren, die Ihre Regex erfüllen.

(\b[\d]{2}\.[\d]{2}\b)|(\b[\d]{2}\b) 

Edit: Versuchen Sie diesen,

\b[\d]{2}\b(\.[\d]{2})? 

Das erste Beispiel hat eine Chance, zum Scheitern verurteilt, da es um aufgrund der Art und Weise eines Kurzschluss abhängt. Dies sollte meines Erachtens mehrere Fälle richtig behandeln.

+0

Dies ist jedoch abhängig von der Reihenfolge. Spielte immer noch damit herum. –

+0

Das hat es geschafft! Ich gerade jetzt -> https://www.youtube.com/watch?v=9N0OHdRFcJA Vielen Dank für Ihre Lösung. – Adrian

+0

NP. Testen Sie es ein wenig, um sicherzustellen, dass es für Sie nicht scheitert. Aber ich glaube, die Verwendung von Wortgrenzen gibt Ihnen das Maß an Kontrolle, nach dem Sie gesucht haben. –

2

ich denke, das sollte funktionieren:

(?<!\d)((\d+\.\d\d)|(\d\d))(?!%|\d) 

Demo (and explanation)

EDIT:

Verbesserte Version:

(?<!\d)(\d{1,2}(?:\.\d{1,2})?)(?!%|\d) 

Demo (and explanation)

+1

Das funktioniert auch! Danke, Anmol. Sehr geschätzt. – Adrian

+0

Vielen Dank für den Link zu regex101! Diese Seite funktioniert besser als die App, für die ich bezahlt habe, um Regex-Strings zu testen, und bietet fantastische Erklärungen zu: Was passiert bei einer Suche? – Adrian

Verwandte Themen