-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应该忽略该部分。

现在我的问题是——

  • 一个条目包含与模式不同的内容
  • 方括号之间的数字数量可能会有所不同。例如,输入字符串可以是 -[[0] -> 0, [1] -> 1, [2] -> 2, else -> 2

我尝试的是在我展示的第二个示例中使用 split -

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

您可以搜索下一个->,然后在下一个拆分,以获得一个“段”。现在,在 处拆分该段->以获得“键”和“值”部分。最后,在剩余,的 s 处拆分 key 以分隔 key(如果它不是最终的“else”-segment)。

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 回答