2009-04-19 3 views
0

Ich verwende einen mathematischen Parser, der% als Mod-Symbol verwendet. Ich möchte es stattdessen für das Prozentzeichen verwenden, um Benutzern zu ermöglichen, "25% * 10" oder "25% von 10" einzugeben und die Antwort "2.5" zu erhalten (sie könnten alles eingeben).Was wäre der Reguläre Ausdruck, um die Zahl vor% -Symbol in der Zeichenfolge abzurufen?

Ich würde dann die regex gefragt, um die "25%" (könnte in einem Teil der Zeichenfolge sein) und eine einfache Berechnung (25/100) und ersetzen Sie dann die 25% in der Zeichenfolge mit der berechnete Wert, der an den Mathe-Parser übergeben wird. Im Grunde mache ich einige Vorberechnungen für die Zahl vor dem Prozentzeichen, bevor ich die vollständige Zeichenfolge an den Mathe-Parser übergebe.

Ich habe immer mit Regex gekämpft und hatte gehofft, jemand könnte mir helfen.

Dank

Antwort

6

Der einfachste Weg wäre der Mathematik-Parser die Trenn tun zu lassen:

s/([0-9.]+)%/($1\/100)/g 

die nur "25%" mit ersetzt "(25/100)" ... so, wenn die Benutzer eingegeben "25%*10" sie haben jetzt "(25/100)*10" was bei der Auswertung gibt ihnen die richtige Antwort.

Alternativ in Perl, könnten Sie tun:

s{([0-9.]+)%}{$1/100}eg 

die und dass, bevor ein zum Mathe-Parser

+0

Was ist mit 12,5%? – Andy

+0

Oder (30 + 20)%? Diese werden ein bisschen härter. Aber das ist nicht die Frage, denke ich. – Andy

+0

@Andy - Das ist in der Tat ein Problem. Deine Beispiele bringen uns vom Regexland in das Parserland. Idealerweise sollte der Parser vor dem% -Zeichen einen maximalen mathematischen Ausdruck annehmen, ihn auswerten und durch 100,0 teilen, um einen echten Bruchwert zu erhalten. Ich glaube, das ist unmöglich mit einem regulären Ausdruck und erfordert etwas wie eine rekursive Descent-Parser. –

1

den regulären Ausdruck finden eine Reihe passieren würde Perl die Division durch einen hundert berechnen '%' Zeichen ist /(\d+)%/.

Mathematische Ausdrücke sind jedoch keine reguläre Sprache, daher ist ein regulärer Ausdruck wahrscheinlich nicht das richtige Werkzeug. Sie sollten stattdessen Ihren Parser anweisen, '%' als "nehmen Sie, was immer davor kommt und dividieren Sie es durch 100" zu interpretieren. "Was auch immer davor steht" kann dann ein beliebiger mathematischer Ausdruck sein, und Sie werden nicht in Operator-Vorrang-Probleme geraten, resp. Sie können diese im Syntaxbaumparser sortieren.

Mischen Textsubstitution mit echten Sprachfeatures verletzt oft das Prinzip der geringsten Verwunderung. Wenn ein Benutzer sieht, dass "%" den vorherigen Wert durch 100 teilt, versucht er möglicherweise, Ausdrücke wie (23+42)% zu verwenden, aber das führt nur zu einem Syntaxfehler. Außerdem benötigen Sie eine ausgefeiltere Regex, wenn Sie etwas wie 1.34e-14% haben, aber diese Dinge würden sich einfach aussortieren, wenn Sie den Baum-Parser verwenden.

+0

Das ist sehr wahr, und der Syntaxfehler, wenn Sie es vom Parser an den Benutzer zurückgeben, ist wahrscheinlich um verwirrend zu sein ... mit der oben genannten Regexp wird "(23 + 42)%" nicht ersetzt und "1.34e-14%" wird durch "1.34e- (14/100)" ersetzt, was nicht besonders schlimm ist nützlich entweder. Auf der anderen Seite würde "23% + 42%" gut funktionieren. Ja, wenn Sie diese Komplexität benötigen, müssten Sie den Parser modifizieren. – NickZoic

Verwandte Themen