Java 正则表达式获取空格之间的所有内容或&引用;
我想像这样变换字符串:Java 正则表达式获取空格之间的所有内容或&引用;,java,regex,Java,Regex,我想像这样变换字符串: test1 test2 "test 3" test4 "test 5" [test1, test2, test 3, test4, test 5] 进入包含空格字符和“之间的所有项目的列表 顺便说一下:那些“不应该在字符串中 这是我的密码: String test = "test1 test2 \"test 3\" test4 \"test 5\""; Pattern pattern = Pattern.compile("(\".*?\")");
test1 test2 "test 3" test4 "test 5"
[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);
如何修改正则表达式以匹配空格和“
之间的所有内容
最后,输出应如下所示:
test1 test2 "test 3" test4 "test 5"
[test1, test2, test 3, test4, test 5]
可以尝试以下正则表达式:
(?您可以尝试以下正则表达式:
(?另一种方法不仅仅是改变regex,而是改变整个算法,这样你就不会只依赖regex,如果“
是报价的结束或开始,那么你就可以尝试(现在删除)使用regex了
"[^"]*"|[^ ]+
这将消耗“
字符,稍后在代码中只需检查匹配是否以”
开头。如果它确实处理删除“
,如果不是,只需将匹配的部分放到列表中即可
因此,您稍微修改的代码可以如下所示
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);
String test=“test1 test2\”test3\”test4\”test5\”;
Pattern=Pattern.compile(“\”([^\“]*)\“\”[^]+”;
匹配器匹配器=模式匹配器(测试);
列表=新的ArrayList();
while(matcher.find()){
字符串匹配=matcher.group();
if(匹配的.startsWith(“\”){
list.add(matcher.group(1));//在引号之间只取一部分
}否则{
添加(matcher.group());
}
}
系统输出打印项次(列表);
如果您的输入也可以是foo“bar baz”bam
的形式,那么这样的解决方案似乎更干净、更安全,因为regex很难不将“
作为匹配的一部分,并能够确定是哪个“
可以而且不能打开/关闭报价。另一种方法不仅仅是更改regex,而是更改整个算法,这样您就不会只依赖regex,如果”
是报价的结束或开始,那么您就可以尝试(现在已删除)使用regex的方法
"[^"]*"|[^ ]+
这将消耗“
字符,稍后在代码中只需检查匹配是否以”
开头。如果它确实处理删除“
,如果不是,只需将匹配的部分放到列表中即可
因此,您稍微修改的代码可以如下所示
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);
String test=“test1 test2\”test3\”test4\”test5\”;
Pattern=Pattern.compile(“\”([^\“]*)\“\”[^]+”;
匹配器匹配器=模式匹配器(测试);
列表=新的ArrayList();
while(matcher.find()){
字符串匹配=matcher.group();
if(匹配的.startsWith(“\”){
list.add(matcher.group(1));//在引号之间只取一部分
}否则{
添加(matcher.group());
}
}
系统输出打印项次(列表);
如果您的输入也可以是foo“bar baz”bam
的形式,那么这样的解决方案似乎更干净、更安全,因为正则表达式很难不将“
作为匹配的一部分,并能够确定哪个”
can和which Not's open/closing quote.将起到如此+1的作用。我只是希望永远不会有像“foo bar”baz
这样的输入。你的意思是验证输入吗?有些事情像不完全一样,问题不是平衡,而是“
可以重复使用,为了防止重复使用,您的答案依赖于这样一个事实,即关闭”
必须在其后面留有空格或放在输入的末尾。这意味着栏中的“
不能被视为有效的关闭引号,因此到处都是[^\s”]+将应用
,而不是foo bar
baz
,我们将看到foo
bar
baz
。我认为更简单的解决方案不仅是改变regex,而且是改变正在使用它的算法。因此,我们应该允许regex使用引号,并在算法中确定我们是否匹配引用的文本。这样会起作用所以+1.我只是希望永远不会有像“foo bar”baz
这样的输入。你的意思是验证输入吗?不完全,问题不在于平衡,但“
可以重复使用,为了防止重复使用,你的答案依赖于关闭”这一事实
后面必须有空格或放在输入的末尾。这意味着栏中的“
不能被视为有效的结束引号,因此到处都是[^\s”]+将应用
,而不是foo bar
baz
,我们将看到foo
bar
baz
。我认为更简单的解决方案不仅是改变regex,而且是改变使用它的算法。因此,我们应该允许regex使用引号,并在算法中确定我们是否匹配引用的文本。对我来说,这就是如果正则表达式使用类似于foo“bar baz”bam
的字符串失败,则没有问题。我从正则表达式中获得的字符串列表用作过滤器。因此,如果用户输入您的字符串,它可能表示“搜索foo和bar baz和bam
”或“搜索foo”bar baz“bam”“
。反正+1,因为如果像foo“bar baz”bam这样的字符串在其案例中作为输入有效,其他人可能会选择您的解决方案。对我来说,如果正则表达式使用像foo“bar baz”bam这样的字符串失败也可以。我从正则表达式中获得的字符串列表被用作过滤器。因此,如果用户输入您的字符串,它可能意味着“搜索foo和bar baz和bam
”或“搜索foo”bar baz“bam”
。无论如何+1,因为如果像foo“bar baz”bam这样的字符串在其大小写中作为输入有效,其他人可能会选择您的解决方案。