[英]Split a string around multiple char sequences
如何使用从输入字符串中提取的多个分隔符在 Java 中拆分字符串? (分隔符在方括号内,可以是两个或多个):
"//[delim1][delim2]\n"
我试过这个:
Pattern p = Pattern.compile("\\[(.*?)\\]");
Matcher m = p.matcher(s);
String[] delimiters;
int c=0;
while (m.find() and c<counter) { //counter is a number of occurences of square brackets
delimiters[c] = m.group(1);
c++;
}
nums = s.split(delimiters));
但显然 split 不以字符串数组作为参数
例如,如果我取字符串
"//[*][%]\n1*2%3"
我应该只考虑 \\n 之后的子字符串,它应该返回数字 1、2 和 3
类java.lang.String
方法split
的参数是一个正则表达式。 Java 8 中的方法文档在这里:
https://docs.oracle.com/javase/8/docs/api/java/lang/String.html#split-java.lang.String-
提供示例输入和预期输出。
这是一个使用 String 的split()和提供三个分隔符(数字、空格、文字问号)的正则表达式的示例:
class Main {
public static void main(String[] args) {
String str = "foo stack3overflow bar?regex\njava";
String[] arr = str.split("(\\d|\\s|\\?)");
System.out.println(java.util.Arrays.toString(arr));
}
}
输出:
[foo, stack, overflow, bar, regex, java]
这是您可以动态选择分隔符的另一个示例。 问题是分隔符需要产生有效的正则表达式,所以我不确定这是否是您要查找的内容。 作为公共方法,它几乎肯定不可靠/有用。
替代方案是在非正则表达式模式上反复拆分(可能很慢)或滚动您自己的split
,在非正则表达式上迭代和斩波(可能容易出错)。
class Main {
public static void main(String[] args) {
String[] delimiters = {" ", "\n", "\\?", "\\d"};
String str = "foo stack3overflow bar?regex\njava";
String pattern = "(" + String.join("|", delimiters) + ")";
String[] arr = str.split(pattern);
System.out.println(java.util.Arrays.toString(arr));
}
}
输出:
[foo, stack, overflow, bar, regex, java]
更新:查看您的示例输入( "//[*][%]\\n1*2%3"
)、代码和所需的输出: [1, 2, 3]
,例如:
import java.util.regex.Matcher;
import java.util.regex.Pattern;
import java.util.ArrayList;
class Main {
public static void main(String[] args) {
String str = "//[*][%]\n1*2%3";
String pattern = "\\d";
ArrayList<String> matches = new ArrayList<>();
Matcher m = Pattern.compile(pattern).matcher(str);
while (m.find()) {
matches.add(m.group());
}
System.out.println(matches.toString());
}
}
一种可能性是遍历分隔符列表:
class Ocl {
public static ArrayList<String> split(String str, List<String> delimiters)
{ if (0 < delimiters.size())
{ String delim = delimiters.get(0);
List<String> taildelims = Ocl.tail(delimiters);
String[] splits = str.split(delim);
ArrayList<String> res = new ArrayList<String>();
for (int j = 0; j < splits.length; j++)
{ res.addAll(Ocl.split(splits[j], taildelims)); }
return res;
}
ArrayList<String> result = new ArrayList<String>();
result.add(str);
return result;
}
}
public static <T> ArrayList<T> tail(List<T> a)
{ ArrayList<T> res = new ArrayList<T>();
for (int i = 1; i < a.size(); i++)
{ res.add(a.get(i)); }
return res;
}
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.