2012-03-25 8 views
11

は、私は、文字列を持っている:のJavaのstring.Split()正規表現

String str = "a + b - c * d/e <f> g >= h <= i == j"; 

私は事業者のすべてに文字列を分割したいのですが、配列内の演算子が含まれ、その結果の配列は次のようになります。

[a , +, b , -, c , *, d , /, e , <, f , >, g , >=, h , <=, i , ==, j] 

私はこの現在持っている:これは、それはかなり近い与えている

public static void main(String[] args) { 
    String str = "a + b - c * d/e <f> g >= h <= i == j"; 
    String reg = "((?<=[<=|>=|==|\\+|\\*|\\-|<|>|/|=])|(?=[<=|>=|==|\\+|\\*|\\-|<|>|/|=]))"; 

    String[] res = str.split(reg); 
    System.out.println(Arrays.toString(res)); 
} 

[a , +, b , -, c , *, d , /, e , <, f , >, g , >, =, h , <, =, i , =, =, j] 

複数の文字演算子を配列に表示させるには、これを行うことができますか?

また、それほど重要ではない第二の質問として、文字の周りから空白を取り除く正規表​​現の方法がありますか?

+6

サンプル式のスペースで区切って結果を得ることができます欲しいです。 – Jeffrey

+1

あなたの二次質問には:文字列にトリム関数があります:http://docs.oracle.com/javase/7/docs/api/java/lang/String.html#trim() –

+1

@Jeffrey:スペースは必ずそこにいる。私は読みやすさのためにそこにスペースを持っていますが、空白の組み合わせでも、まったく同じでもありません。しかし、アイデアをありがとう! – user677786

答えて

31
String[] ops = str.split("\\s*[a-zA-Z]+\\s*"); 
String[] notops = str.split("\\s*[^a-zA-Z]+\\s*"); 
String[] res = new String[ops.length+notops.length-1]; 
for(int i=0; i<res.length; i++) res[i] = i%2==0 ? notops[i/2] : ops[i/2+1]; 

とワード境界で分割することができ2分割(事業者による1、変数ずつ)

+0

これはうまくいく、これは、配列の先頭の要素を取り除くだけです(空です) –

+0

戻った後、これを行うのが最善の方法です。私は正規表現でそれをやりたかったのですが、これは完全に動作します。ありがとう! – user677786

0

あなたの正規表現を非操作文字で分割することはできますか?

String ops[] = string.split("[a-z]") 
// ops == [+, -, *, /, <, >, >=, <=, == ] 

これは明らかに配列内の変数を返しません。たぶん、あなたはあなたがこれはそれを行う必要があります\ bの

+0

正確な解決策ではありませんが、それは私に働いたアイデアを与えました!ありがとう!私は、ソリューションのメインポストを編集します! – user677786

15
str.split (" ") 
res27: Array[java.lang.String] = Array(a, +, b, -, c, *, d, /, e, <, f, >, g, >=, h, <=, i, ==, j) 
1

をインターリーブすることができます。 resにうまく格納されたすべて。

+0

試しましたか?あなたは問題があるだろう。 – tchrist

+0

OK、私はそれを認めます、私はそれを.NETでテストし、うまくいきました。空のエントリを削除するのは簡単ではありません。正規表現を適用する前に、文字列の空白を削除することは確実に.replaceAllで簡単に行うことができます。 –

4
String str = "a + b - c * d/e <f> g >= h <= i == j"; 
    String reg = "\\s*[a-zA-Z]+"; 

    String[] res = str.split(reg); 
    for (String out : res) { 
     if (!"".equals(out)) { 
      System.out.print(out); 
     } 
    } 

出力:+ - */<>> = < = ==

-3

また、のような何かができる:

String str = "a + b - c * d/e <f> g >= h <= i == j"; 
String[] arr = str.split("(?<=\\G(\\w+(?!\\w+)|==|<=|>=|\\+|/|\\*|-|(<|>)(?!=)))\\s*"); 

それは空白と可変長の言葉を処理し、生成配列:

[a, +, b, -, c, *, d, /, e, <, f, >, g, >=, h, <=, i, ==, j]