我正在寻找正确的正则表达式,为我提供以下结果:
我目前有:
Pattern pattern = Pattern.compile("[^\\s\"']+|\"([^\"]*)\"|'([^']*)'");
Run Code Online (Sandbox Code Playgroud)
......但以下示例并未完全奏效.谁可以帮我这个?
例子:
我不确定你是否可以在一个Matcher.match电话中执行此操作,但是你可以通过循环来完成.
此代码段通过Matcher.find()重复使用解决了上面提到的所有情况:
Pattern pattern = Pattern.compile("\"([^\"]+)\"|'([^']+)'|\\S+");
List<String> testStrings = Arrays.asList("foo bar", "\"foo bar\"","'foo bar'", "'foo bar", "\"'foo bar\"", "foo bar'", "foo bar\"", "\"foo bar\" \"stack overflow\"", "\"foo' bar\" \"stack overflow\" how do you do");
for (String testString : testStrings) {
int count = 1;
Matcher matcher = pattern.matcher(testString);
System.out.format("* %s%n", testString);
while (matcher.find()) {
System.out.format("\t* group%d: %s%n", count++, matcher.group(1) == null ? matcher.group(2) == null ? matcher.group() : matcher.group(2) : matcher.group(1));
}
}
Run Code Online (Sandbox Code Playgroud)
这打印:
* foo bar
* group1: foo
* group2: bar
* "foo bar"
* group1: foo bar
* 'foo bar'
* group1: foo bar
* 'foo bar
* group1: 'foo
* group2: bar
* "'foo bar"
* group1: 'foo bar
* foo bar'
* group1: foo
* group2: bar'
* foo bar"
* group1: foo
* group2: bar"
* "foo bar" "stack overflow"
* group1: foo bar
* group2: stack overflow
* "foo' bar" "stack overflow" how do you do
* group1: foo' bar
* group2: stack overflow
* group3: how
* group4: do
* group5: you
* group6: do
Run Code Online (Sandbox Code Playgroud)