用String.split(..)替换StringTokenizer

时间:2011-05-08 18:35:29

标签: java regex split

是否可以构建一个正则表达式,以便与Javas Pattern.split(..)方法一起使用来重现StringTokenizer("...", "...", true)行为?

这样输入就会被拆分为预定义标记字符和它们之间运行的任何abitrary字符串的交替序列。

StringTokenizer的JRE参考状态应该被视为已弃用,而String.split(..)可以替代使用split。所以它被认为是可能的。

我想使用StringTokenizer的原因是正则表达式经常被高度优化。例如{{1}}在Android平台虚拟机上速度很慢,而正则表达式模式由优化的本机代码执行。

3 个答案:

答案 0 :(得分:1)

考虑到split的文档没有指定这种行为,并且只有一个可选参数来告诉数组应该有多大..不,你不能。

另外,看看我能想到的唯一一个可能具有此功能的其他类 - 扫描仪 - 它也没有。所以我认为最简单的方法是继续使用Tokenizer,即使它被弃用了。写自己的课程要好 - 虽然这不应该太难(真的很琐碎),但我可以想出更好的方法来花时间。

答案 1 :(得分:1)

正则表达式可以帮助你

Patter p = Pattern.compile("(.*?)(\\s*)");
//put the boundary regex in between the second brackets (where the \\s* now is)
Matcher m = p.matcher(string);
int endindex=0;
while(m.find(endindex)){
//m.group(1) is the part between the pattern
//m.group(2) is the match found of the pattern
endindex = m.end();
}
//then the remainder of the string is string.substring(endindex);

答案 2 :(得分:1)

import java.util.List;
import java.util.LinkedList;
import java.util.regex.Pattern;
import java.util.regex.Matcher;

public class Splitter {


public Splitter(String s, String delimiters) {
    this.string = s;
    this.delimiters = delimiters;
    Pattern pattern = Pattern.compile(delimiters);
    this.matcher = pattern.matcher(string);
}

public String[] split() {
    String[] strs = string.split(delimiters);
    String[] delims = delimiters();
    if (strs.length == 0) { return new String[0];}
    assert(strs.length == delims.length + 1);
    List<String> output = new LinkedList<String>();
    int i;
    for(i = 0;i < delims.length;i++) {
        output.add(strs[i]);
        output.add(delims[i]);
    }
    output.add(strs[i]);
    return output.toArray(new String[0]);
}

private String[] delimiters() {
    List<String> delims = new LinkedList<String>();
    while(matcher.find()) {
        delims.add(string.subSequence(matcher.start(), matcher.end()).toString());
    }
    return delims.toArray(new String[0]);
}

public static void main(String[] args) {
    Splitter s = new Splitter("a b\tc", "[ \t]");
    String[] tokensanddelims = s.split();
    assert(tokensanddelims.length == 5);
    System.out.print(tokensanddelims[0].equals("a"));
    System.out.print(tokensanddelims[1].equals(" "));
    System.out.print(tokensanddelims[2].equals("b"));
    System.out.print(tokensanddelims[3].equals("\t"));
    System.out.print(tokensanddelims[4].equals("c"));
}


private Matcher matcher;
private String string;
private String delimiters;
}