我想以下列方式分割字符串:
String s = "dotimes [sum 1 2] [dotimes [sum 1 2] [sum 1 3]]"
结果:
{"dotimes", "[sum 1 2]", "[dotimes [sum 1 2] [sum 1 3]]"
我尝试使用这个正则表达式:
s.split("\\s(?=\\[)|(?<=\\])\\s")
但结果如下:
dotimes
[sum 1 2]
[dotimes
[sum 1 2]
[sum 1 3]]
有没有办法以我想要的方式分割字符串使用正则表达式?
答案 0 :(得分:0)
有没有办法以我想要的方式分割字符串使用正则表达式?
不,没有。正则表达式(如果匹配)返回由()
包围的字符串和子字符串,或者如果使用全局标志,则返回所有完整匹配的列表。您没有获得其他匹配项的子项的嵌套列表。
将它与Java结合起来可以解决问题。我不了解Java,但我会尝试解释这个类似java的代码:
Array match_children (Array input) {
Array output;
foreach (match in input) {
// The most important part!
// The string starts with "[", so it is the beginning of a new nest
if (match.startsWith("[")) {
// Use the same ragex as below
Array parents = string.match(matches 'dotimes' and all between '[' and ']');
// Now, call this same function again with the
match = match_children(parents);
// This stores an array in `match`
}
// Store match in output list
output.push(match);
}
return output;
}
String string = "dotimes [sum 1 2] [dotimes [sum 1 2] [sum 1 3]]";
// "dotimes [sum 1 2] [dotimes [sum 1 2] [sum 1 3]]"
Array parents = string.match(matches 'dotimes' and all between '[' and ']');
// "dotimes", "[sum 1 2]", "[dotimes [sum 1 2] [sum 1 3]]"
// Make sure to use a global flag
Array result = match_children(Array input);
// dotimes
// [
// sum 1 2
// ]
// [
// dotimes
// [
// sum 1 2
// ]
// [
// sum 1 3
// ]
// ]
同样,我不了解Java,如果需要更多的澄清,只需评论。 :) 希望这会有所帮助。
答案 1 :(得分:0)
虽然不是特别漂亮,但是如果没有来自OP的正式语法可能会在一般化方面表现不佳。
{
//String s = "sum 1 2";
String s = "dotimes [sum 1 2] [dotimes [sum 1 2] [sum 1 3]]";
int depth = 0;
int pos = 0;
for (int c = 0; c <= s.length(); ++c){
switch (c == s.length() ? ' ' : s.charAt(c)){
case '[':
if (++depth == 1){
pos = c;
}
break;
case ' ':
if (depth == 0){
String token = s.substring(pos, c == s.length() ? c : c + 1);
if (!token.matches("\\s*")){ /*ingore white space*/
System.out.println(token);
}
pos = c + 1;
}
break;
case ']':
if (--depth == 0){
String token = s.substring(pos, c + 1);
if (!token.matches("\\s*")){ /*ingore white space*/
System.out.println(token);
}
pos = c + 1;
}
break;
}
}
}
它将分割字符串写入标准输出;随便添加到您喜欢的容器中。