(可选)使用String.split(),在分隔符的最后一次出现处拆分一个字符串

时间:2012-06-07 21:49:51

标签: java regex string split tokenize

我有一个匹配此正则表达式的字符串:^.+:[0-9]+(\.[0-9]+)*/[0-9]+$,可以很容易地将其显示为(Text):(Double)/(Int)。我需要将这个字符串拆分为三个部分。通常这很容易,除了(Text)可能包含冒号,所以我不能拆分任何冒号 - 而是最后冒号。

.*是贪婪的,所以它已经做了一个相当干净的工作,但这不会作为String.split()的正则表达式,因为它将吃我的(Text)作为一部分分隔符。理想情况下,我想要一些能够返回带有三个字符串的String []的东西。我没有使用String.split()就可以100%罚款。

3 个答案:

答案 0 :(得分:5)

我不喜欢正则表达式(只是在开玩笑,但我不是很擅长)。

String s = "asdf:1.0/1"
String text = s.substring(0,s.lastIndexOf(":"));
String doub = s.substring(s.lastIndexOf(":")+1,text.indexOf("/"));
String inte = s.substring(text.indexOf("/")+1,s.length());

答案 1 :(得分:3)

为什么不直接使用正则表达式?

Pattern p = Pattern.compile("^(.*):([\\d\\.]+)/(\\d+)$");
Matcher m = p.matcher( someString );
if (m.find()) {
  m.group(1); // returns the text before the colon
  m.group(2); // returns the double between the colon and the slash
  m.group(3); // returns the integer after the slash
}

或类似的。模式^(.*):([\d\.]+)/(\d+)$假定您实际上在所有三个位置都有值,并且只允许在双位置中使用句点/句点,因此您可能希望根据您的规范进行调整。

答案 2 :(得分:1)

String.split()通常用于更简单的场景,其中分隔符和格式更一致,并且当您不知道要分割多少元素时。

您的用例需要一个普通的旧正则表达式。您知道字符串的格式,并且您知道要收集三个值。尝试以下内容。

Pattern p = Pattern.compile("(.+):([0-9\\.]+)/([0-9]+)$");
Matcher m = p.matcher(myString);
if (m.find()) {
    String myText = m.group(1);
    String myFloat = m.group(2);
    String myInteger = m.group(3);
}