Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/333.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java (可选)使用String.split(),在最后一次出现分隔符时分割字符串_Java_Regex_String_Split_Tokenize - Fatal编程技术网

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);
}