7

次のような式を分割する必要があります

a+b-c*d/e 

abcdを個別に (e文字列の配列として)取得するだけでなく=-*d/(演算子の配列も) を個別に取得します。私は次のように試しました:

String myString;

String myString={"a+b-c*d/e");

String[] result=new String();

String[] separator=new String[]{"+","-","/","*"};

result=myString.split(separator);

しかし、それはエラーを示しています。それを解決する方法は?

4

5 に答える 5

23

第 1 の問題: -

複数宣言String myString;

2番目の問題: -

文字列が正しく初期化されていません。末尾に二重引用符がありません。両端からブラケットとブレースを取り外します。

String myString = "a+b-c*d/e";

3番目の問題: -

配列オブジェクトではなく、String オブジェクトで初期化された文字列配列。

String[] result=new String();  // Should be `new String[size]`

実際、事前に配列を初期化する必要はありません。

4番目の問題: -

String.split正規表現を引数として取り、配列を渡しました。動作しないでしょう。

使用する: -

String[] result = myString.split("[-+*/]");

すべての演算子で分割します。


そして、あなたのこの声明に関して: -

同様に=, -, *, d, /(演算子の配列も)個別に。

あなたがここで何を望んでいるのか理解できません。サンプル文字列には が含まれていません=。でdはありませんoperator。編集する場合は参照してください。

アップデート : -

演算子も配列に保持する場合は、次の正規表現を使用できます: -

String myString= "a+b-c*d/e";
String[] result = myString.split("(?<=[-+*/])|(?=[-+*/])");
System.out.println(Arrays.toString(result));

/*** Just to see, what the two parts in the above regex print separately ***/
System.out.println(Arrays.toString(myString.split("(?<=[-+*/])")));
System.out.println(Arrays.toString(myString.split("(?=[-+*/])")));

出力 : -

[a, +, b, -, c, *, d, /, e]
[a+, b-, c*, d/, e]
[a, +b, -c, *d, /e]

(?<=...)手段look-behind assertion、 および(?=...)手段look-ahead assertion

于 2012-11-23T08:00:14.557 に答える
4

アプローチに加えて、次のsplitものも使用できますjava.util.StringTokenizer

 String myString = "a+b-c*d/e";

 List<String> operatorList = new ArrayList<String>();
 List<String> operandList = new ArrayList<String>();
 StringTokenizer st = new StringTokenizer(myString, "+-*/", true);
 while (st.hasMoreTokens()) {
    String token = st.nextToken();

    if ("+-/*".contains(token)) {
       operatorList.add(token);
    } else {
       operandList.add(token);
    }
 }

 System.out.println("Operators:" + operatorList);
 System.out.println("Operands:" + operandList);

結果:

Operators:[+, -, *, /]
Operands:[a, b, c, d, e]
于 2012-11-23T08:11:57.050 に答える
1

あなたがやりたいことは、トークナイザーではなくパーサーに似ていると思います。

文字列トークナイザーでは、通常、いくつかの要素が連結された長い文字列 (つまり、「パラメーター 1;パラメーター 2;パラメーター 3」) があり、「トークン」を使用してこれらの要素を分離します。関数 "String.split" では、基本的に次のように言っています。さまざまな要素を分離します。」そして、「parameter1」、「parameter2」、「parameter3」を取得します。セパレーターは気にしません。

しかし、「a+bc*d/e」のような数式では、個々の要素 (オペランドと演算子) をすべて取得する必要があります。ここには明示的な区切り記号はなく、順序も重要です。パーサー ライブラリを使用して、代わりに小さな文法を記述します。

于 2012-11-23T08:39:19.753 に答える
1

a / b / c / d / eを取得するだけです:

String myString = "a+b-c*d/e";
String[] result=myString.split("[-+*/]");

より読みやすい形式で:

String myString = "a+b-c*d/e";
String[] result2=myString.split("["+Pattern.quote("+-*/")+"]");

+-*/ を取得するには:

ArrayList<Character> list = new ArrayList<Character>();
for (char c:myString.toCharArray())
{
   if ("+-*/".contains(""+c)) list.add(c);
}
System.out.println(list);

編集:不要なエスケープ文字を削除しました。

于 2012-11-23T08:03:52.570 に答える
0

私の知る限り、箱から出してすぐに何をすることはできません。は (C# とは異なり) 配列全体を使用するのsplit(String regex)ではなく、有効な正規表現を表す文字列のみを使用します。

あなたができることはSet、あなたの演算子と 2 を含むa を定義することArrayListsです。それができたら、文字列を反復処理し、セットにその特定の文字が含まれているかどうかを確認します(したがって、それが演算子であるかどうかを判断します)。ある場合は一方のリストに入れ、そうでない場合は別のリストに入れます。

最後に、as String 配列toArray(new String\[arraySize\])を取得するために使用できます。ArrayLists

于 2012-11-23T08:02:29.403 に答える