正则表达式以获取空格之间的所有内容或“”

时间:2015-08-05 14:54:04

标签: java regex

我想像这样转换字符串:

test1 test2 "test 3" test4 "test 5"

进入一个列表,其中包含空格字符和""之间的所有项目。

顺便说一句:那些"不应该在字符串

这是我的代码:

    String test = "test1 test2 \"test 3\" test4 \"test 5\"";
    Pattern pattern = Pattern.compile("(\".*?\")");
    Matcher matcher = pattern.matcher(test);
    List<String> list = new ArrayList<String>();
    while (matcher.find()) {
        list.add(matcher.group());
    }
    System.out.println(list);

但这只会匹配""之间的所有内容。结果就是这样:

["test 3", "test 5"]

如何修改我的正则表达式以匹配空格和""之间的所有内容?

最后输出应如下所示:

[test1, test2, test 3, test4, test 5]

2 个答案:

答案 0 :(得分:2)

您可以尝试以下正则表达式:

brew linkapps qt5
brew link --force qt5

此外,如果您打算经常使用正则表达式,建议使用常量以避免每次重新编译它,例如:

(?<=")[^"]*(?="\s|"$)|[^\s"]+

输出:

private static final Pattern REGEX_PATTERN = 
        Pattern.compile("(?<=\")[^\"]*(?=\"\\s|\"$)|[^\\s\"]+");

public static void main(String[] args) {
    String input = "test1 test2 \"test 3\" test4 \"test 5\"";

    Matcher matcher = REGEX_PATTERN.matcher(input);
    while (matcher.find()) {
        System.out.println(matcher.group());
    }
}

在线查看demo

答案 1 :(得分:1)

其他方法只是不改变正则表达式,而是整个算法,所以你不要只依赖正则表达式,如果"结束或引用开始,那么可能会出现问题。所以你可以简单地尝试solution posted earlier by sp00m(现已删除)使用正则表达式

"[^"]*"|[^ ]+

会消耗"个字符,稍后会在代码中检查您的匹配是否以"开头。如果它处理删除",如果不是简单地将匹配的部分放到列表中。

因此,您稍加修改的代码可能看起来像

String test = "test1 test2 \"test 3\" test4 \"test 5\"";
Pattern pattern = Pattern.compile("\"([^\"]*)\"|[^ ]+");
Matcher matcher = pattern.matcher(test);
List<String> list = new ArrayList<String>();
while (matcher.find()) {
    String matched = matcher.group();
    if (matched.startsWith("\"")){
        list.add(matcher.group(1));//take only part between quotes
    }else{
        list.add(matcher.group());
    }
}
System.out.println(list);

这样的解决方案似乎更清晰,并且可能更安全,以防您的输入也可以是foo"bar baz"bam的形式,其中正则表达式难以包含"作为匹配的一部分并且能够确定"可以和哪些不能打开/关闭报价。