2016-03-21 1 views
0

Ive vor recht eine ähnliche Frage gestellt und implementiert diese regex: "(?<!^)(?=\\D)|(?<=\\D)" aufzuspalten ein String wie folgt aus:Regex für die Spaltung bei jedem Charakter, sondern halten Zahlen und Dezimalzahlen zusammen

String input = "x^(24-3x)"; 
String[] signs = input.split("regex here"); 
for (int i = 0; i < signs.length; i++) { 
System.out.println(signs[i]); } 

mit dem Ausgang ergibt: "x", "^", "(", "24", "-", "3", "x", ")"

Jetzt muss ich einen String unter den gleichen Bedingungen aufteilen, aber auch Dezimalzahlen zusammenhalten. ATM, ein Eingang wie (0.5) ergibt: "(", "0", ".", "5", ")" aber ich brauche die Dezimalzahl, um in einem gruppiert zu bleiben string wie: "(", "0.5", ")". Danke

+0

Statt Rutschen, warum suchen nicht nach etwas wie '\ d + | \ w + | [^() + - * /] '? –

+0

Sie könnten eine Antwort von jemandem bekommen ... aber ich habe ein sehr starkes Gefühl, dass Sie an falscher Stelle suchen. Wenn Sie es später mit verschachtelten Klammern usw. auswerten möchten, sollten Sie es mit einem geeigneten Grammatik-Parser statt mit Regex machen. Es ist etwas mehr Arbeit am Anfang, aber zahlt sich sehr bald und ermöglicht es Ihnen, für zukünftige Anforderungen gerecht zu werden –

+0

@ ArturBiesiadowski, Regex ist eine vollkommen gültige Möglichkeit, einen Eingabestream für einen Grammatik-Parser zu tokenisieren. So funktioniert schließlich die gute alte 'lex'. –

Antwort

2

Statt Spaltung zwischen den Token, können Sie ganz einfach einen regulären Ausdruck definieren verschiedene Token passende, zum Beispiel so etwas wie [0-9]+|[a-z]+|[()^*/+-], dh eine oder mehr Zahlen oder ein weiteren mehr Buchstaben oder jeder einzelnes Sonderzeichen In der Praxis kann dies ein wenig mehr Ausarbeitung erfordern, z.B. für Dezimalzahlen zu berücksichtigen:

List<String> tokens = new ArrayList<>(); 
Pattern p = Pattern.compile("(\\d+(\\.\\d+)?)|[a-zA-Z]+|[()^*/+-]"); 
Matcher m = p.matcher("exp(42) * x^(24-3x) - 3.14"); 
while (m.find()) { 
    tokens.add(m.group()); 
} 

Ergebnis für tokens[exp, (, 42,), *, x, ^, (, 24, -, 3, x,), -, 3.14]

ist einen genaueren Blick auf die Komponenten der regex Einnahme:

  • (\\d+(\\.\\d+)?) einigen Stellen, gegebenenfalls gefolgt von einem Punkt und mehr Ziffern. Wenn Sie auch Nummern wie .1 oder 42. zulassen möchten, müssen Sie dies etwas ändern.
  • [a-zA-Z]+ Ein oder mehrere Buchstaben; Wenn Sie Variablen mit Unterstrichen oder Ziffern zulassen möchten, z. B. var_23, können Sie dies auf etwas wie ([a-zA-Z_]\w+) (nicht getestet) erweitern.
  • [()^*/+-] Ein einzelnes Sonderzeichen, z. B. eine Operation oder eine Klammer. Beachten Sie, dass die als letzte kommt, so dass sie nicht als Bereich interpretiert wird. Wenn Sie auch mit mehreren Zeichen Operatoren wie != oder <= haben, können Sie diese zu einer anderen disjunction ändern: +|-|==|<=|...
+0

Was ist mit den Dezimalzahlen? In meinem Beispiel wird 0,5 noch auf "0", "." , "5" ' – Zi1mann

+0

Diese Antwort berücksichtigt Dezimalstellen. –

+0

@ Zi1mann Ich habe schon etwas für die Dezimalstellen hinzugefügt. Siehe das Beispiel. –

Verwandte Themen