我有一个匹配此正则表达式的字符串:^.+:[0-9]+(\.[0-9]+)*/[0-9]+$
,可以很容易地将其显示为(Text):(Double)/(Int)
。我需要将这个字符串拆分为三个部分。通常这很容易,除了(Text)
可能包含冒号,所以我不能拆分任何冒号 - 而是最后冒号。
.*
是贪婪的,所以它已经做了一个相当干净的工作,但这不会作为String.split()的正则表达式,因为它将吃我的(Text)
作为一部分分隔符。理想情况下,我想要一些能够返回带有三个字符串的String []的东西。我没有使用String.split()就可以100%罚款。
答案 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);
}