Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/348.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 正则表达式获取空格之间的所有内容或&引用;_Java_Regex - Fatal编程技术网

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这样的字符串在其大小写中作为输入有效,其他人可能会选择您的解决方案。