-1

次のようなコードを理解しています

tokens = mystring.split(\\s);

空白 (または複数の空白) に基づいて文字列を分割し、空白の間にトークンを含む配列を返します。ただし、分割関数のこれらのパラメーターをどのように考え出すかを理解するのに苦労しています。複数の区切り文字を指定するにはどうすればよいですか?

具体的には、文字列を区切り、次の区切り記号で分割したいと思います。

  • -
  • +
  • *
  • /
  • #
  • _ (これはアンダースコアです)
  • ^ (それはニンジンです)

はい、スタックを使用して後置計算機を実装しようとしていると思われる場合。しかし、それはポイントではありません...ポイントは、分割メソッドのパラメーターをどのように考え出すかを理解するのに苦労していることです。これを説明する優れたリソースはありますか?

ありがとうございました。これが重複している場合は、お詫び申し上げます。(分割方法に関するほとんどの質問は、それがどのように機能するかの一般的な説明ではなく、特定の質問に関係していました)

4

4 に答える 4

0

単純な数式を解析するために複雑な正規表現は必要ありません。StringTokenizerそのような式を解析するには十分です。*後置計算機を作成するので、おそらく空白を無視して、などのすべての演算子を返したいと思うでしょう+

ここにsplit関数があります

public static List<String> split(String line, String delim, boolean includeDelim, boolean removeWhiteSpace) {
    List<String> tokens = new ArrayList<String>();
    StringTokenizer parser = new StringTokenizer(line, delim, includeDelim);

    while (parser.hasMoreTokens()) {
        String token = parser.nextToken();
        if (removeWhiteSpace) {
            token = token.replaceAll("\\s+", "");
        }
        tokens.add(token);
    }

    return tokens;
}

上記の機能を使用すると、すべての区切り記号を元に戻すか、区切り記号の間の部分を戻すかを指定できます。空白を無視することも選択できます。

そして、ここに私の主な機能があります

public static void main(String aa[]) {
    final String DELIM = "+-*/^#_";
    Scanner in = new Scanner(System.in);

    while (true) {
        String line = in.nextLine();
        System.out.println(">" + split(line, DELIM, true, true));
    }
}

出力例

12 ^ 36 - 15 + 17
>[12, ^, 36, -, 15, +, 17]

500*6/3+2
>[500, *, 6, /, 3, +, 2]

私はそれらすべての区切り文字を取り戻しています。関数によって返されるリストを操作できsplitます。

于 2013-08-31T10:08:49.650 に答える
0

最初に正規表現を理解する必要があります。基本的な使用法は非常に簡単です:)要件に応じて、次のように分割できますString[] split = mystr.split("[-+*/#_^]"); 。角括弧は、一致する文字のリストを提供します。その角括弧内の文字のいずれかが一致する場合、それは一致です。

于 2013-08-31T05:10:06.150 に答える