有没有办法告诉String.split("(")函数仅按第一次出现的字符串"("进行分割?
例如:
String test = "A*B(A+B)+A*(A+B)";
test.split("(") should result to ["A*B" ,"A+B)+A*(A+B)"]
test.split(")") should result to ["A*B(A+B" ,"+A*(A+B)"]
有没有办法告诉String.split("(")函数仅按第一次出现的字符串"("进行分割?
例如:
String test = "A*B(A+B)+A*(A+B)";
test.split("(") should result to ["A*B" ,"A+B)+A*(A+B)"]
test.split(")") should result to ["A*B(A+B" ,"+A*(A+B)"]
没错,绝对可以:
test.split("\\(", 2);
如String.split(String,int)文档所述:
limit
参数控制模式匹配的次数,因此影响结果数组的长度。如果限制n大于零,则模式最多被应用n - 1次,数组的长度将不大于n,并且数组的最后一个条目将包含所有超出最后一个匹配分隔符的输入。
java.util.regex.PatternSyntaxException: 未关闭的分组,索引位置在1附近。
- Pedro Ferreira尝试使用这个解决方案,它比使用正则表达式更加通用、快速和简单:
public static String[] splitOnFirst(String str, char c) {
int idx = str.indexOf(c);
String head = str.substring(0, idx);
String tail = str.substring(idx + 1);
return new String[] { head, tail} ;
}
像这样测试:
String test = "A*B(A+B)+A*(A+B)";
System.out.println(Arrays.toString(splitOnFirst(test, '(')));
System.out.println(Arrays.toString(splitOnFirst(test, ')')));
str.indexOf(c) == -1
,它不会崩溃。 - ruakhchar c
更改为String c
即可解决问题”:您还需要将1
更改为c.length()
。 - ruakhtest.split("\\(", 2);
(看到了吗?我刚刚做到了),而不是你示例中的函数。此外,如果经常使用它,则编译正则表达式还可以进一步提高其效率(并不是说该表达式非常复杂)。 - Code Jockey
(
有特殊的含义。例如,(34)+
表示“一个或多个出现的34”,而34+
表示“一个3,后跟一个或多个出现的4”。因此,反斜杠用于“引用”或“转义”括号,表示“实际的(字符”而不是使用括号的特殊含义。 - ruakhassert "param=".split("=").length == 1;
但是assert "param=".split("=", 2).length == 2;
,第二个标记为空字符串assert "param=".split("=", 2)[1].equals("");
。 - Sergey Ponomarevassert "param".split("=", 2).length == 1;
。只是split
没有数字参数或数字参数为0
时,会丢弃尾随的空字符串。 - ruakh