正则表达式拆分空格,除了()括号内的空格

时间:2018-03-29 02:00:31

标签: java regex

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

1 个答案:

答案 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

Demo