我想像这样转换字符串:
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]
答案 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
的形式,其中正则表达式难以包含"
作为匹配的一部分并且能够确定"
可以和哪些不能打开/关闭报价。