-3

Java での解析について多くの質問があることを理解しています。ただし、次の文字列を正確に解析する方法がわかりません-

入力文字列は次のとおりです-

[[0, 0] -> 0, [0, 1] -> 1, [0, 2] -> 2, [1, 0] -> 3, [0, 4] -> 1, [0, 1] -> 2, [0, 6] -> 3, else -> 2

出力を次のように解析したい -

Entry 1 : number1, number2, number3
Entry 2 : number4, number5, number6
...

したがって、この例の出力は次のようになります-

Entry 1 : 0, 0, 0
Entry 2 : 0, 1, 1
....

正確には、そのelse -> 2部分は無視する必要があります。

今、私の質問は -

  • 1 つのエントリにパターン以外のものが含まれています
  • 角かっこ内の数字の量はさまざまです。たとえば、入力文字列は次のようになります-[[0] -> 0, [1] -> 1, [2] -> 2, else -> 2

私が試したのは、私が示した2番目の例に分割を使用することでした-

String value = "[[0] -> 0, [1] -> 1, [2] -> 2, else -> 2";
value = value.replaceAll("\\[", "");
value = value.replaceAll("\\]", "");
String split[] = value.split(",");

for(int j=0;j<split.length;j++)
{
    String split2[] = split[j].split("->");
    split2[0] = split2[0].replaceAll("\\s","");
    if(split2[0].contains("else"))
        continue;    
    System.out.println(split2[0],+ " " + split split2[1].replaceAll("\\s",""));                     
}

しかし、これは角括弧内の可変量の数値では機能しません。パターンマッチングはどのように正確に行うべきですか? 正規表現を使用できますか?

ありがとう !

4

2 に答える 2

2

次の を検索し->、その後で分割して,1 つの「セグメント」を取得できます。次に、そのセグメントを で分割して->、「キー」部分と「値」部分を取得します。最後に、残り,の s でキーを分割して、キーを分離します (最後の "else" セグメントでない場合)。

String value = "[[0, 0] -> 0, [0, 1] -> 1, [0, 2] -> 2, [1, 0] -> 3, [0, 4] -> 1, [0, 1] -> 2, [0, 6] -> 3, else -> 2";
value = value.replaceAll("\\[", "");
value = value.replaceAll("\\]", "");
value = value.replaceAll(" ", "");               // remove spaces, too,
                                                 // no need to trim later
int start = 0;
while (start < value.length()) {
    int arrow = value.indexOf("->", start);      // next -> after start
    int comma = value.indexOf(",", arrow);       // next comma after ->
    comma = comma > -1 ? comma : value.length(); // final segment?

    String segment = value.substring(start, comma);
    String key = segment.split("->")[0];         // before ->
    String val = segment.split("->")[1];         // after ->

    if (key.contains("else")) {
        System.out.println("Default: " + val);
    } else {
        String[] keys = key.split(",");
        System.out.println(Arrays.toString(keys) + ": " + val);
    }
    start = comma + 1;                           // continue after segment
}

(出力は更新された質問と完全には一致しませんが、これは簡単に修正できるはずです。)


のようなパターンを使用して、正規表現も使用できます\[\d+(, \d+)*\] -> \d+。これはその部分と一致しませんelseが、とにかく重要ではないことは理解しています。

String regex = "(\\[\\d+(, \\d+)*\\] -> \\d+)";
Matcher matcher = Pattern.compile(regex).matcher(value);
while (matcher.find()) {
    System.out.println(matcher.group());
}

の出力は のmatcher.group()ような文字列になります"[0, 0] -> 0"

于 2013-07-10T14:42:33.823 に答える
1

入力の形式に注意してください。パターンを探します。括弧付きの数値範囲の開始は「[」で始まります。括弧付きの数値範囲の末尾は、範囲が矢印 "->"、数値、およびカンマの後に ']' で終了します。以下のコードの出力を見てください。ソリューションに簡単に到達できるはずです。

 public static void main(String[] args)
    {
        final String input = "[[3] -> 7, [0, 0] -> 0, [0, 1] -> 1, [0, 2] -> 2, [1, 0] -> 3, [0, 4] -> 1, [0, 1] -> 2, [0, 6] -> 3, else -> 2";
        String[] split;

        split = StringUtils.split(input, "->, ");

        for (String item : split)
        {
            System.out.println("Item: " + item);
        }
    }

注: StringUtils はapache commons lang の一部です。

于 2013-07-10T14:44:25.390 に答える