在这种情况下,使用
java.util.regex.Matcher更容易使用find()而不是任何类型的拆分.
也就是说,不必定义令牌之间的分隔符的模式,您可以为令牌本身定义模式.
以下是一个例子:
String text = "1 2 \"333 4\" 55 6 \"77\" 8 999";
// 1 2 "333 4" 55 6 "77" 8 999
String regex = "\"([^\"]*)\"|(\\S+)";
Matcher m = Pattern.compile(regex).matcher(text);
while (m.find()) {
if (m.group(1) != null) {
System.out.println("Quoted [" + m.group(1) + "]");
} else {
System.out.println("Plain [" + m.group(2) + "]");
}
}
Plain [1]
Plain [2]
Quoted [333 4]
Plain [55]
Plain [6]
Quoted [77]
Plain [8]
Plain [999]
模式本质上是:
"([^"]*)"|(\S+)
\_____/ \___/
1 2
有两个替代:
>第一个交替匹配开头双引号,除了双引号(在组1中捕获)之外的任何序列,然后关闭双引号
>第二个替换匹配组2中捕获的任何非空白字符序列
交替的顺序在这种模式中是重要的
请注意,这不会在引用的段中处理转义的双引号.如果您需要这样做,那么该模式变得更加复杂,但是Matcher解决方案仍然可行.
参考
也可以看看
附录
相关问题