正则表达式匹配字符串中单引号或双引号之间的单词

Joc*_*cht 1 java regex

我正在寻找正确的正则表达式,为我提供以下结果:

  • 它需要将单/双引号包围的单词组合在一起
  • 当字符串中没有其他单引号时,它需要继续打印单引号
  • 当没有被单/双引号包围时 - 在空间上分开

我目前有:

Pattern pattern = Pattern.compile("[^\\s\"']+|\"([^\"]*)\"|'([^']*)'");
Run Code Online (Sandbox Code Playgroud)

......但以下示例并未完全奏效.谁可以帮我这个?

例子:

  • foo吧
    • group1:foo
    • 第2组:吧
    • 描述:拆分空间
  • "foo bar"
    • group1:foo bar
    • 说明:用双引号包围所以组foo和bar,但不要打印双引号
  • 'foo bar'
    • group1:foo bar
    • 描述:与上面相同,但有单引号
  • 'foo吧
    • group1:'foo
    • 第2组:吧
    • 描述:拆分空间并保持单引号
  • "'foo bar"
    • group1:'foo bar
    • 描述:用双引号包围所以组'foo和bar并保持单引号
  • foo bar'
    • group1:foo
    • group2:bar'
  • foo酒吧"
    • group1:foo
    • group2:bar"
  • "foo bar""堆栈溢出"
    • group1:foo bar
    • group2:堆栈溢出
  • "foo'bar""堆栈溢出"你好
    • group1:foo'bar
    • group2:堆栈溢出
    • 第3组:如何
    • group4:做
    • 第5组:你
    • group6:做

Kep*_*pil 7

我不确定你是否可以在一个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)