5

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

.*是贪婪的,所以它已经做了一个非常巧妙的工作,但这不会作为 String.split() 的正则表达式工作,因为它会吃掉我(Text)作为分隔符的一部分。理想情况下,我想要一些可以返回带有三个字符串的 String[] 的东西。我不使用 String.split() 100% 没问题。

4

3 回答 3

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());
于 2012-06-07T21:55:38.157 回答
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+)$假设您实际上在所有三个位置都有值,并且在双位置只允许一个句点/句号,因此您可能需要根据您的规范对其进行调整。

于 2012-06-07T22:00:08.873 回答
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);
}
于 2012-06-07T22:02:01.657 回答