web-dev-qa-db-ja.com

Java String.split()Regex

私は文字列を持っています:

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]

配列に複数の文字演算子を表示するためにこれにできることはありますか?

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

15
user677786
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];

これでうまくいくはずです。すべてがresにうまく保存されています。

37
IchBinKeinBaum
str.split (" ") 
res27: Array[Java.lang.String] = Array(a, +, b, -, c, *, d, /, e, <, f, >, g, >=, h, <=, i, ==, j)
16
user unknown
    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);
        }
    }

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

4
dat_clover

\ bでWordの境界で分割できます

1
Andrew Morton

非操作文字で分割された正規表現を反転できますか?

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

これは明らかに配列内の変数を返しません。たぶん、2つの分割をインターリーブできます(1つは演算子によるもの、1つは変数によるもの)

0
Chris White