1

我想将字符串拆分为两个可能的分隔符“/”或“//”上的列表。但更重要的是,分隔符也应该放在同一个列表中。我不能在 Guava 或 java.util.Scanner 中使用 Splitter。

Scanner s = new Scanner(str);
s.useDelimiter("//|/");
while (s.hasNext()) {
    System.out.println(s.delimiter());
    System.out.println(s.next());
}

s.delimiter()返回//|/。我想得到/or //

你知道任何其他可以做到这一点的图书馆吗?

我写了一些代码,它可以工作,但它不是很好的解决方案:

public static ArrayList<String> processString(String s) {
    ArrayList<String> stringList = new ArrayList<String>();
    String word = "";
    for (int i = 0; i < s.length(); i++) {
        if (s.charAt(i) == '/' && i < s.length() && s.charAt(i + 1) == '/') {
            if (!word.equals(""))
                stringList.add(word);
            stringList.add("//");
            word = "";
            i++;
        } else if (s.charAt(i) == '/') {
            if (!word.equals(""))
                stringList.add(word);
            stringList.add("/");
            word = "";
        }else{
            word = word + String.valueOf(s.charAt(i));
        }
    }
    stringList.add(word);
    return stringList;
}

"some/string//with/slash/or//two"返回列表中some, /, string, //, with, /, slash, /, or, //, two

"/some/string//with/slash/or//two"返回列表中/, some, /, string, //, with, /, slash, /, or, //, two

"//some/string//with/slash/or//two"返回列表中//, some, /, string, //, with, /, slash, /, or, //, two

4

2 回答 2

5

useDelimiter方法有一个签名,它接受一个Pattern对象,而不是一个String.

你应该改用那个:

Scanner s = new Scanner(str);
s.useDelimiter(Pattern.compile("/{1,2}"));
while (s.hasNext()) {
    System.out.println(s.delimiter());
    System.out.println(s.next());
}

为了捕获分隔符,您将需要更改方法。

Pattern p = new Pattern("(/{0,2})([^/]+)");
Matcher m = p.matcher(str);
while(m.find()) {
   String token     = m.group(2);
   String delimiter = m.group(1); // (preceding delimiter. may be null)
   /*
    * ...
    */
}
于 2012-10-29T17:36:57.803 回答
0

这似乎是使用正则表达式的好选择。您可以在此处阅读有关 Java 正则表达式的更多信息。

于 2012-10-29T17:37:00.610 回答