0

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

4

4 回答 4

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);
}
于 2013-04-06T10:48:13.223 回答
1

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

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

于 2013-04-06T10:45:55.740 回答
1

有一个 Scanner 类可以让你定义一个分隔符,这样你就可以调用 next() 函数,直到找到你想要的元素。在这种情况下不需要使用正则表达式。

于 2013-04-06T17:59:02.230 回答
0

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

于 2013-04-06T10:46:03.543 回答