Java (可选)使用String.split(),在最后一次出现分隔符时分割字符串
我有一个与此正则表达式匹配的字符串:Java (可选)使用String.split(),在最后一次出现分隔符时分割字符串,java,regex,string,split,tokenize,Java,Regex,String,Split,Tokenize,我有一个与此正则表达式匹配的字符串:^.+:[0-9]+(\.[0-9]+)*/[0-9]+$,它可以很容易地可视化为(文本):(双精度)/(Int)。我需要把这根绳子分成三部分。通常这很容易,除了(Text)可能包含冒号,因此我不能在任何冒号上拆分,而是在最后一个冒号上拆分 *是贪婪的,因此它已经做了相当出色的工作,但是它不能作为String.split()中的正则表达式,因为它会吃掉作为分隔符一部分的我的(Text)。理想情况下,我想要一个返回字符串[]和三个字符串的东西。我完全可以不使用S
^.+:[0-9]+(\.[0-9]+)*/[0-9]+$
,它可以很容易地可视化为(文本):(双精度)/(Int)
。我需要把这根绳子分成三部分。通常这很容易,除了(Text)
可能包含冒号,因此我不能在任何冒号上拆分,而是在最后一个冒号上拆分
*
是贪婪的,因此它已经做了相当出色的工作,但是它不能作为String.split()中的正则表达式,因为它会吃掉作为分隔符一部分的我的(Text)
。理想情况下,我想要一个返回字符串[]和三个字符串的东西。我完全可以不使用String.split()。我不喜欢正则表达式(只是开玩笑,我喜欢,但我不太擅长)
为什么不直接使用正则表达式呢
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+)$
假设您实际上在所有三个位置都有值,并且只允许在双精度位置使用句点/句点,因此您可能需要根据您的规范对其进行调整 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);
}
@我想跳过开头的
(
),他说()
用于可视化目的。不要认为这些括号是我一生中犯下的第一个错误。这与我之前在知道额外冒号的可能性之前所犯的错误类似。我觉得需要正则表达式来避免将来的错误。现在,不要使用[\d\.]+
要匹配双精度,如果我想严格要求\d+(\.\d+)*
。我可以安全地只使用组0、1、3吗?也就是说,sometext:other:2/4
和sometext:other:2.0/4
sill组的方式相同吗?它将是组1、2和4,但您不需要为此费心。只需将新组设为非捕获组:\d+(?:\.\d+)
group(0)返回整个匹配字符串。这是索引不从零开始的少数情况之一。@Alanmore对严格的双正则表达式有一个很好的建议。
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);
}