2016-03-21 5 views
0

アイブ氏は前に非常に似て質問をして、この正規表現を実装小数 "x", "^", "(", "24", "-", "3", "x", ")"すべての文字で分割するが、維持番号の正規表現とは、一緒に

今、同じ条件でストリングを分割する必要がありますが、10進数も一緒に保持する必要があります。 ATMの場合、(0.5)のような入力は"(", "0", ".", "5", ")"になりますが、stringのように1つにグループ化しておくためには10進数が必要です:"(", "0.5", ")"。 は[0-9]+|[a-z]+|[()^*/+-]のような例何か、すなわち、1つ以上の数字のために、あなたがトークン間で

+0

の代わりに滑り、なぜ '\ D +のようなものを探していない| \ワット+:あなたはまた、マルチ文字の演算子を持っている場合は、そのよう!=<=として、あなたは別の論理和にこれを変更することができます+ - * /] '? –

+0

あなたは誰かから答えを得るかもしれませんが、間違った場所で探しているという非常に強い気持ちがあります。後でネストした角括弧などで評価したい場合は、正規表現ではなく、適切な文法パーサーでそれを行うべきです。それは最初のところで少し仕事ですが、すぐに払い戻され、将来の要件を満たすことができます –

+0

@ArturBiesiadowski、正規表現は文法パーサの入力ストリームをトークン化するための完全に有効な方法です。結局のところ、良い古い 'lex'が動作する方法です。 –

答えて

2

代わりの分割、あなたは非常に簡単に、いくつかの異なるトークンに一致する正規表現を定義することができ感謝または 1以上以上の文字または任意の単一の特殊文字。実際には、これにはもう少し精緻化が必要な場合があります。小数を考慮するため:

  • (\\d+(\\.\\d+)?)いくつかの数字、必要に応じてドットが続くとより:tokensため

    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()); 
    } 
    

    結果は[exp, (, 42,), *, x, ^, (, 24, -, 3, x,), -, 3.14]

    正規表現のコンポーネントを詳しく見を取っています数字。 .142.などの番号も許可する場合は、これを少し変更する必要があります。

  • [a-zA-Z]+ 1文字以上。たとえば、var_23のように、変数にアンダースコアまたは数字を許可する場合は、([a-zA-Z_]\w+)(テストされていない)に拡張することができます。
  • 操作や括弧などの1つの特殊文字。 -が最後に来るので、範囲として解釈されないことに注意してください。 )([^ | +|-|==|<=|...
+0

小数点はどうなりますか?私の例では、0.5はまだ "" 0 "、"。 "に分割されています。 、 "5" ' – Zi1mann

+0

この回答には小数点以下の桁が含まれています。 –

+0

@ Zi1mann私はすでに小数点のために何かを追加しました。この例を参照してください。 –

関連する問題