按空格分割Java字符串,而不是按包含空格的双引号(";)分割
我希望在空格上拆分短语,而不是在带引号的字符串中拆分空格(即,一对双引号内的字符串按空格分割Java字符串,而不是按包含空格的双引号(";)分割,java,split,Java,Split,我希望在空格上拆分短语,而不是在带引号的字符串中拆分空格(即,一对双引号内的字符串“) 例如: software term "on the fly" and "synchrony" 应分为以下5个部分: software term on the fly and synchrony 那么我如何在java中实现这一点呢?这个正则表达式为您实现了拆分,并清除了任何分隔引号: String str = "software term \"on the fly\" and \"
“
)
例如:
software term "on the fly" and "synchrony"
应分为以下5个部分:
software
term
on the fly
and
synchrony
那么我如何在java中实现这一点呢?这个正则表达式为您实现了拆分,并清除了任何分隔引号:
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());
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]
此正则表达式为您实现拆分,并清除任何分隔引号:
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]
上一个员额的备选方案:
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;
}
上一个员额的备选方案:
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;
}
你不能重写Java本身的规则……有些语言足够灵活,但Java不行。我认为问题在于如何编写一个函数,将字符串
“software term\”on fly\”和“synchron\”
转换为列表[“software”,“term”,“on fly”,“and”,“synchron”]
。是的,这是我所期望的结果。任何人都知道如何用Java API实现这一点。请注意,重复是相同的基本问题,但重复的逗号和引号在[
和]
上分开。只需将该正则表达式中的逗号替换为空格,并将\[
替换为\”
@Bohemian似乎不是这样。你测试过你建议的那些更改吗?你不能重写Java本身的规则……有些语言足够灵活,但Java却不行。我认为问题在于如何编写一个函数来转换字符串“软件术语”和“同步”
到列表[“软件”、“术语”、“动态”、“和”、“同步”]
。是的,这是我期望的结果。任何人都知道如何用Java API实现这一点。请注意,重复是相同的基本问题,但重复在[
和上以逗号和引号分隔
-只需将该正则表达式中的逗号替换为空格,并将\\[
替换为\”
@Bohemian似乎不是这样。您是否测试了您建议的更改?