2013-04-06 21 views
0

标准Java API中有没有一个简短的手段,它允许我从1行中的字符串1^2^3^4中获取令牌?我想说第三个元素“3”被提取。我不想要编译正则表达式的任何东西。让它在预编译的正则表达式中传递是没问题的,但每次调用方法时都会不断编译正则表达式会伤害CPU。字符串在java中分割/标记化而不编译正则表达式?

+0

你的意思是你不想使用String.split(),因为它必须使用一种模式? – 2013-04-06 10:38:47

+0

你能展示一些代码吗?我知道这就是你要求的,但是你完全确定CPU有损害,你不仅仅是过早地优化了吗? – Gothmog 2013-04-06 10:51:21

+0

@Gothmog是的。最后一次使用Java 1.5或1.6进行检查时,编译器不会对其进行优化(即:编译模式并将其替换为引用)。我假设情况仍然如此。使用hprof,我已经看到了一些简单的方法,就像一个方法中的正则表达式占用了很大一部分cpu计算时间。 – Zombies 2013-04-06 11:13:56

回答

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

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

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

1

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

相关问题