Java正则表达式匹配双引号子串

时间:2017-10-10 09:06:58

标签: java regex

我想解析以下字符串:

String text = "\"w1 w\"2\" w3 | w4 w\"5 \"w6 w7\"";
// "w1 w"2" w3 | w4 w"5 "w6 w7"

我正在使用Pattern.compile(regex).matcher(text),所以我在这里缺少的是正确的正则表达式。 规则是正则表达式必须:

  • 隔离任何单个字
  • 双引号包围的任何子字符串都是匹配
  • 一个单词中的双引号必须被忽略(我稍后会用空格替换它们)。

所以得到的匹配应该是:

  1. w1 w“2
  2. W3
  3. |
  4. W4
  5. W“5
  6. w6 w7
  7. 双引号包含子串中是否包含双引号是无关紧要的(例如1.可以是 w1 w“2 ”w1 w“2”)。

    我想出的是这样的事情:

    "\"(.*)\"|(\\S+)"
    

    我还尝试了上述正则表达式的许多不同变体(包括lookbehind / forward),但没有一个能给我预期的结果。

    有关如何改善这一点的想法吗?

2 个答案:

答案 0 :(得分:1)

这似乎可以完成这项工作:

"(?:[^"]|\b"\b)+"|\S+

Debuggex Demo

Regex101 Demo

请注意,在Java中,因为我们使用字符串文字作为正则表达式,所以反斜杠需要在另一个反斜杠之后:

String regex = "\"(?:[^\"]|\\b\"\\b)+\"|\\S+";

答案 1 :(得分:1)

试试这个正则表达式:

(?:(?<=^")|(?<=\s")).*?(?="(?:\s|$))|(?![\s"])\S+

Click for Demo

<强>说明

  • (?:(?<=^")|(?<=\s")) - 正面Lookbehind找到"之前的位置。此"要么位于字符串的开头,要么位于空格
  • 之后
  • .*? - 匹配除了换行符之外的任何字符的0次出现
  • (?="(?:\s|$)) - 用于验证到目前为止匹配的内容后面是空格或匹配后没有任何内容($)的正面预测。
  • | - 或(上述匹配或以下内容)
  • (?![\s"]) - 用于验证未在空格或"
  • 后面的位置的否定前瞻
  • \S+ - 匹配1个以上的非空格字符

Java代码(Generated from here):

Run code here to see the output

import java.util.regex.Matcher;
import java.util.regex.Pattern;

public class MyClass {
    public static void main(String args[]) {
    final String regex = "(?:(?<=^\")|(?<=\\s\")).*?(?=\"(?:\\s|$))|(?![\\s\"])\\S+";
    final String string = "\"w1 w\"2\" w3 | w4 w\"5 \"w6 w7\"";

    final Pattern pattern = Pattern.compile(regex);
    final Matcher matcher = pattern.matcher(string);

    while (matcher.find()) {
        System.out.println("Full match: " + matcher.group(0));
        for (int i = 1; i <= matcher.groupCount(); i++) {
            System.out.println("Group " + i + ": " + matcher.group(i));
        }
    }

    }
}

<强>输出:

enter image description here