我希望在空格上分割短语,而不是在带引号的字符串中分隔空格(即双引号"
对中的字符串)。
例如:
software term "on the fly" and "synchrony"
应分为以下5个部分:
software
term
on the fly
and
synchrony
那我怎么能在java中实现呢?
答案 0 :(得分:6)
此正则表达式为您实现了分割,并清除了任何分隔引号:
String[] terms = input.split("\"?( |$)(?=(([^\"]*\"){2})*[^\"]*$)\"?");
它通过拆分空间来工作,但前提是后面跟着偶数引号。
引号本身已被消耗,因此它们不会在输出中结束,可选择将它们包括在分割术语中。
需要使用术语( |$)
来捕获尾随引用。
请注意,如果可以引用第一个字词,则您需要首先清理该引号:
String[] terms = input.replaceAll("^\"", "").split("\"?( |$)(?=(([^\"]*\"){2})*[^\"]*$)\"?");
测试代码:
String input = "software term \"on the fly\" and \"synchron\"";
String[] terms = input.split("\"?( |$)(?=(([^\"]*\"){2})*[^\"]*$)\"?");
System.out.println(Arrays.toString(terms));
输出:
[software, term, on the fly, and, synchron]
答案 1 :(得分:0)
String str = "software term \"on the fly\" and \"synchron\"";
String[] arr = str.split("\""); // split on quote first
List<String> res = new LinkedList<>();
for(int i=0; i<arr.length; i++) {
arr[i] = arr[i].trim();
if ("".equals(arr[i])) {
continue;
}
if (i % 2 == 0) {
String[] tmp = arr[i].split("\\s+"); // second, split on spaces (when needed)
for (String t : tmp) {
res.add(t);
}
} else {
res.add("\"" + arr[i] + "\""); // return the quote back to place
}
}
System.out.println(res.toString());
<强>输出强>
[software, term, "on the fly", and, "synchron"]
答案 2 :(得分:0)
替代上一篇文章:
boolean quoted = false;
for(String q : str.split("\"")) {
if(quoted)
System.out.println(q.trim());
else
for(String s : q.split(" "))
if(!s.trim().isEmpty())
System.out.println(s.trim());
quoted = !quoted;
}