Mozilla/5.0 (Windows NT 6.1) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/65.0.3325.181 Safari/537.36
所以我的输出应该是这样的:这里我需要忽略1或2位后的索引
Mozilla/5.0
Windows NT 6.1
或
Mozilla/5.0
Windows NT 6.1
AppleWebKit/537.36
KHTML, like Gecko
Chrome/65.0.3325.181
Safari/537.36
答案 0 :(得分:2)
看来括号只出现在本身包含空格的术语周围。这些括号有助于区分作为术语一部分的空白和用于分隔术语的空白。事实上,如果没有括号,我们可能无法轻易地将这些术语分开。
以下方法采用双重方法。首先,我们分为以下几种模式:
(?<=\)\s)|(?=\s\()
这会将括号中的术语分隔成单独的行,而不在括号中的一系列术语仍然会聚集在一起:
Mozilla/5.0
(Windows NT 6.1)
AppleWebKit/537.36
(KHTML, like Gecko)
Chrome/65.0.3325.181 Safari/537.36
第二步是迭代此结果,再次拆分每个术语。这一次,我们可以合法地在空白上拆分,知道仍然存在的唯一空格是用于分隔术语。
String input = "Mozilla/5.0 (Windows NT 6.1) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/65.0.3325.181 Safari/537.36";
String[] parts = input.split("(?<=\\)\\s)|(?=\\s\\()");
List<String> results = new ArrayList<>();
for (String part : parts) {
part = part.trim();
if (part.length() == 0) continue;
if (part.charAt(0) == '(') {
results.add(part.substring(1, part.length()-1));
}
else {
String[] items = part.split("\\s+");
for (String item : items) {
results.add(item);
}
}
}
for (String result : results) {
System.out.println(result);
}
Mozilla/5.0
Windows NT 6.1
AppleWebKit/537.36
KHTML, like Gecko
Chrome/65.0.3325.181
Safari/537.36