从`StringTokenizer`获取原始字符串中的位置

时间:2012-12-23 11:19:17

标签: java stringtokenizer

我需要在字符串中获取以空格分隔的标记,但我还需要知道每个标记启动时原始字符串中的字符位置。有没有办法用StringTokenizer执行此操作。另外,据我所知,这是一个遗产类;是否有更好的替代方法来使用StringTokenizer

3 个答案:

答案 0 :(得分:7)

您应该始终使用String#split()来分割字符串,而不是StringTokenizer

但是,由于您还希望在字符串中使用标记的位置,因此最好使用PatternMatcher类。你有Matcher#start()方法,它给出了匹配模式的字符串的位置。

以下是一个例子: -

String str = "abc asf basdfasf asf";
Matcher matcher = Pattern.compile("\\S+").matcher(str);

while (matcher.find()) {
    System.out.println(matcher.start() + ":" + matcher.group());
}

模式\\S+匹配该字符串中的非空格字符。使用Matcher#find()方法返回所有匹配的子字符串。

答案 1 :(得分:1)

您可以使用String.split()

轻松完成此操作
 String text = "hello world example";
 int tokenStartIndex = 0;
 for (String token : text.split(" ")) {      
   System.out.println("token: " + token + ", tokenStartIndex: " + tokenStartIndex);
   tokenStartIndex += token.length() + 1; // +1 because of whitespace
 }

打印:

token: hello, tokenStartIndex: 0
token: world, tokenStartIndex: 6
token: example, tokenStartIndex: 12

答案 2 :(得分:0)

我改进了micha的答案,因此它可以处理相邻的空间:

String text = "hello  world     example";
int start = 0;
for (String token : text.split("[\u00A0 \n]")) {
    if (token.length() > 0) {
        start = text.indexOf(token, start);
        System.out.println("token: " + token + ", start at: " + start);
    }
}

输出是:

token: hello, start at: 0
token: world, start at: 7
token: example, start at: 17