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

java中的字符串拆分/标记化而不编译正则表达式?,java,performance,code-formatting,Java,Performance,Code Formatting,在标准JavaAPI中是否有一个快捷方式,允许我从一行字符串1^2^3^4中获取令牌?我想说要提取的第三个元素“3”。我不想要任何编译正则表达式的东西。将它传递到预编译的正则表达式中是可以的,但是每次调用方法时不断编译正则表达式会损害CPU。您可以使用在Java中编译正则表达式,这将导致一个模式对象。您可以随时重复使用该对象,而无需再次编译正则表达式。只要将编译后的模式存储在一个变量中,就可以在每次需要时检索它 如果定义的模式匹配^之间的任何数字,则可以使用创建一个匹配器对象,该对象根据输入匹配

在标准JavaAPI中是否有一个快捷方式,允许我从一行字符串
1^2^3^4
中获取令牌?我想说要提取的第三个元素“3”。我不想要任何编译正则表达式的东西。将它传递到预编译的正则表达式中是可以的,但是每次调用方法时不断编译正则表达式会损害CPU。

您可以使用在Java中编译正则表达式,这将导致一个
模式
对象。您可以随时重复使用该对象,而无需再次编译正则表达式。只要将编译后的模式存储在一个变量中,就可以在每次需要时检索它


如果定义的模式匹配
^
之间的任何数字,则可以使用创建一个
匹配器
对象,该对象根据输入匹配您的模式。该方法将允许您访问给定输入中的特定匹配项。

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


如果定义的模式匹配
^
之间的任何数字,则可以使用创建一个
匹配器
对象,该对象根据输入匹配您的模式。该方法将允许您访问给定输入中的特定匹配项。

我想,如果您希望完全避免使用正则表达式来解决性能问题,您可以尝试使用迭代处理。我还没有将其与标准进行对比,但从源代码来看,我很难想象出显著的性能差异。

我想如果您希望完全避免使用正则表达式来解决性能问题,您可以尝试使用迭代处理。我还没有将其与标准进行对比,但查看源代码时,我很难想象会有显著的性能差异。

您可以使用预编译

…或者,也可以直接使用代码,而不是使用正则表达式,因为它不会创建不需要的字符串对象,所以应该更快

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);
}

您可以使用预编译文件轻松拆分

…或者,也可以直接使用代码,而不是使用正则表达式,因为它不会创建不需要的字符串对象,所以应该更快

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);
}

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

有一个Scanner类,允许您定义拆分器字符,以便在找到所需元素之前调用next()函数。在这种情况下,不需要使用正则表达式。

您的意思是不想使用String.split(),因为它必须使用模式?您能展示一些代码吗?我知道这是你想要的,但你完全确定CPU会受到损害,而且你不是在过早地优化吗?@Gothmog-Yes。上次我用Java1.5或1.6检查时,编译器不会优化它(即:编译模式并用它替换引用)。我认为情况仍然如此。使用hprof,我看到一些简单的东西,比如方法中的正则表达式,会占用大量cpu计算时间。你是说你不想使用String.split(),因为它必须使用模式?你能展示一些代码吗?我知道这是你想要的,但你完全确定CPU会受到损害,而且你不是在过早地优化吗?@Gothmog-Yes。上次我用Java1.5或1.6检查时,编译器不会优化它(即:编译模式并用它替换引用)。我认为情况仍然如此。使用hprof,我看到了一些简单的东西,比如方法中的正则表达式,占用了大量的cpu计算时间。