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

Java 正则表达式来匹配字符串中单引号或双引号之间的单词,java,regex,Java,Regex,我正在寻找正确的正则表达式以提供以下结果: 它需要用单引号/双引号将单词分组 当字符串中没有其他单引号时,它需要继续打印单引号 当不被单引号/双引号包围时-按空格拆分 我目前有: Pattern pattern = Pattern.compile("[^\\s\"']+|\"([^\"]*)\"|'([^']*)'"); 。。。但是下面的例子并不完全有效。 谁能帮我做这个 示例: 富吧 第一组:富 第2组:酒吧 描述:在空间上拆分 “富吧” 第一组:富吧 描述:被双引号包围,所以将

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

  • 它需要用单引号/双引号将单词分组
  • 当字符串中没有其他单引号时,它需要继续打印单引号
  • 当不被单引号/双引号包围时-按空格拆分
我目前有:

Pattern pattern = Pattern.compile("[^\\s\"']+|\"([^\"]*)\"|'([^']*)'");
。。。但是下面的例子并不完全有效。 谁能帮我做这个

示例:

  • 富吧
    • 第一组:富
    • 第2组:酒吧
    • 描述:在空间上拆分
  • “富吧”
    • 第一组:富吧
    • 描述:被双引号包围,所以将foo和bar分组,但不要打印双引号
  • “富吧”
    • 第一组:富吧
    • 说明:同上,但带有单引号
  • “富吧
    • 第一组:富
    • 第2组:酒吧
    • 说明:按空格拆分并保留单个报价
  • “‘富吧’
    • 第一组:富吧
    • 描述:由双引号包围,因此将“foo”和“bar”分组,并保留单引号
  • 富吧'
    • 第一组:富
    • 第二组:酒吧
  • “富吧”
    • 第一组:富
    • 第2组:酒吧“
  • “foo-bar”“堆栈溢出”
    • 第一组:富吧
    • 组2:堆栈溢出
  • “foo”bar“堆栈溢出”你怎么办
    • 第一组:富吧
    • 组2:堆栈溢出
    • 第三组:如何
    • 第四组:做什么
    • 第五组:你
    • 第六组:做什么
任何时候,只要你有配对(让它成为引号或大括号),你就会离开正则表达式领域,进入语法领域,这需要解析器

我会留给你的

更新:

再解释一下

语法通常表示为:

construct -> [set of constructs or terminals]
例如,对于引号

doblequotedstring := " simplequotedstring "
simplequotedstring := string ' string
                      | string '
                      | ' string
                      | '
这是一个简单的例子;互联网上会有适当的语法引用例子

为此,我使用了aflex和ajacc(用于Ada;在Java中存在jflex和jjacc)。您将标识符列表传递给aflex,生成一个输出,将该输出和语法传递给ajacc,然后获得一个Ada解析器。自从我使用它们以来已经有很多时间了,我不知道是否有更精简的解决方案,但在基本上它将需要相同的输入。

任何时候你有配对(让它成为引号或大括号),你就离开正则表达式领域,进入语法领域,这需要解析器

我会留给你的

更新:

再解释一下

语法通常表示为:

construct -> [set of constructs or terminals]
例如,对于引号

doblequotedstring := " simplequotedstring "
simplequotedstring := string ' string
                      | string '
                      | ' string
                      | '
这是一个简单的例子;互联网上会有适当的语法引用例子


为此,我使用了aflex和ajacc(用于Ada;在Java中存在jflex和jjacc)。您将标识符列表传递给aflex,生成一个输出,将该输出和语法传递给ajacc,然后获得一个Ada解析器。自从我使用它们以来,已经有很多时间了,我不知道是否有更精简的解决方案,但在基本上,它将需要相同的输入。

我不确定您是否可以在一个
匹配器中完成此操作。匹配
调用,但您可以通过循环来完成。
此代码段通过反复使用
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));
    }
}

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

我不想在正则表达式中解析HTML字符串。我尝试将单词分组,并在单引号/双引号和空格上拆分它们。我想这些就是我们使用。。。正则表达式,不是吗?在我看来,别无选择。请阅读我的评论。匹配引号意味着您正在使用“适当”语法(所有正则表达式都是语法,但并非所有语法都是正则表达式;您的示例不是正则表达式)。现在阅读链接的答案。没有办法用正则表达式解析“正确”语法。您可以将正则表达式用于恰好是正则表达式的语法子集(例如,检测字符串是否以引号开头和结尾),而不使用其他任何东西。这在数学上是不可能的。顺便说一句,我链接的答案有这样的风格和这么多的投票,因为当你告诉某人他需要一个语法时,通常的答案是“但我想用正则表达式来做”…我对这个答案投了反对票,因为它没有帮助。为此使用正则表达式是完全合理的。这个问题和解析HTML之间有着天壤之别。@dan1111,请随意告诉我正则表达式。我会很喜欢它,如果它工作的话,我不会试图解析正则表达式中的HTML字符串。我尝试将单词分组,并在单引号/双引号和空格上拆分它们。我想这些就是我们使用。。。正则表达式,不是吗?在我看来,别无选择。请阅读我的评论。匹配引号意味着您正在使用“适当”语法(所有正则表达式都是语法,但并非所有语法都是正则表达式;您的示例不是正则表达式)。现在阅读链接的答案。没有办法用正则表达式解析“正确”语法。您可以将正则表达式用于恰好是正则表达式的语法子集(例如,检测字符串是否以引号开头和结尾),而不使用其他任何东西。这在数学上是不可能的。顺便说一句,我链接的答案有这样的风格和这么多的投票,因为当你告诉某人他需要一个语法时,通常的答案是“但我想用正则表达式来做”…我对这个答案投了反对票,因为它没有帮助。为此使用正则表达式是完全合理的。这个问题和解析HTML之间有着天壤之别。@dan1111,请随意告诉我正则表达式。我会喜欢投票,如果它工作,我张贴了一个可能是一个良好的开端。它不处理逗号而不是spa上的单引号和拆分