2017-01-30 1 views
1

Ich habe diesen Regulärer Ausdruck:Regulärer Ausdruck für mathematischen Ausdruck und logisch mit Gruppen

/(?:\-?[0-9a-zA-Z]+(?:\.?[0-9a-zA-Z]+)?+[\+\-\*\/\<\>\=])+\-?[0-9a-zA-Z]+(?:\.?[0-9a-zA-Z]+)?/ 

Das Problem ist, dass ich die n Gruppen müssen, dass dieser Ausdruck entschlüsseln kann, aber ich weiß nicht, wie es zu ändern .

Ich verwendete https://regex101.com/ zu bearbeiten, und entfernte die ?:, die den Ausdruck verursachte keine Übereinstimmung.

Der reguläre Eingang ist wie 1+2-b*4/c or 1+a=3-b.

Die Antwort, die ich brauche, ist wie

full match[0] = 1+a=3-b 

group[1] = '1' 
group[2] = '+' 
group[3] = 'a' 
group[4] = '=' 
group[5] = '3' 
group[6] = '-' 
group[7] = 'b' 
+0

u 2 regex (ur regexp zum Validieren verwenden können und "\ d +" für bekommen alle Gruppennummern dann). –

+0

nicht nur ein einzelnes Zeichen, ich benutze Strings wie "string" oder Nummer wie 12 oder 12.3, diese reguläre Ausdruck passen diese Art von Eingaben, aber ich konnte nicht die Gruppen für später betreiben @ chris85 –

+0

@ chris85, thx Kumpel, das ist genau was ich will. –

Antwort

1

Sie, dass die Expression einiges vereinfachen kann. Beachten Sie außerdem, dass das einzige Zeichen in Ihrer Zeichenklasse, das tatsächlich mit Escapezeichen versehen werden musste, - ist. Wenn Sie es zum ersten/letzten Zeichen verschieben, hat dies den gleichen Effekt. Diese Regex sollte erreichen, was Sie sind nach:

[a-z]+|(?:\d+(?:\.\d+)?)|[-+/*=] 

Das für die kontinuierlichen (mindestens 1) Klein Alpha-Zeichen, fortlaufende Nummern (mit dezimal Möglichkeit) sucht, oder eine (die meisten?) Mathematische Operation. Da dies eine separate Regel ist, wird jeder Fund ein Treffer sein.

PHP Usage:

foreach(array('12.3+22-this*4/varable','1+a=3-b') as $equat) { 
    preg_match_all('~[a-z]+|(?:\d+(?:\.\d+)?)|[-+/*=]~', $equat, $matches); 
    print_r($matches[0]); 
} 

PHP Demo: https://eval.in/727124

Regex Demo: https://regex101.com/r/0mTL6d/1