java中的字符串拆分/标记化而不编译正则表达式?

时间:2013-04-06 10:36:00

标签: java performance code-formatting

标准Java API中是否有一个简短的手段允许我从一行中的字符串1^2^3^4中获取一个令牌?我想说要提取的第3个元素“3”。我不想要任何编译正则表达式的东西。将它传入预编译的正则表达式是很好的,但每次调用方法时不断编译正则表达式都会损害CPU。

4 个答案:

答案 0 :(得分:3)

您可以使用预编译的Pattern;

轻松拆分
static Pattern regex = Pattern.compile("\\^");

private static String getEntry(String input, int which)
{
    return regex.split(input)[which];
}

...或者,只是在直接代码中执行它而不是使用正则表达式,因为它不会创建不需要的String对象,它应该更快。

private static String getEntry(String input, int which)
{
    int left, right = -1;
    do {
        left = right;
        right = input.indexOf('^', right+1);
    }
    while(which-- > 0 && right >= 0);

    if(which != -1)
        return null;

    if(right == -1)
        return input.substring(left+1);

    return input.substring(left+1, right);
}

答案 1 :(得分:1)

您可以使用Pattern.compile在Java中编译正则表达式,这将生成Pattern个对象。您可以根据需要随时重复使用该对象,而无需每次都重新编译正则表达式。只需将编译后的模式存储在变量中,这样您就可以在每次需要时检索它。

如果您定义的模式与^之间的任意数字相匹配,则可以使用Pattern.matcher()创建一个Matcher对象,使您的模式与您的输入相匹配。 Matcher.group(int)方法可让您访问给定输入中的特定匹配项。

答案 2 :(得分:1)

Scanner类允许您定义拆分器字符,因此您可以调用next()函数,直到找到所需的元素。在这种情况下,不需要使用正则表达式。

答案 3 :(得分:0)

我想如果您希望完全避免使用正则表达式来解决性能问题,可以尝试进行迭代处理的Apache Commons StringUtils split()。我没有对Java standard library one进行基准测试,但从源头上看,我很难想象显着的性能差异。