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

Java正则表达式匹配双引号子字符串,java,regex,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),所以这里缺少的是正确的regex。 规则是regex必须: 孤立任何一个单词 任何被双引号包围的子字符串都是匹配项 必须忽略单词中的双引号(稍后我将用空格替换它们) 因此,结果匹配应为: w1 w“2 w3 | w4 w

我要分析以下字符串:

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)
,所以这里缺少的是正确的regex。 规则是regex必须:

  • 孤立任何一个单词
  • 任何被双引号包围的子字符串都是匹配项
  • 必须忽略单词中的双引号(稍后我将用空格替换它们)
因此,结果匹配应为:

  • w1 w“2
  • w3
  • |
  • w4
  • w“5
  • w6 w7
  • 双引号是否包含在双引号包围的子字符串中无关紧要(例如,1.可以是w1 w“2“w1 w”2

    我想到的是这样的:

    "\"(.*)\"|(\\S+)"
    
    我还尝试了上述正则表达式的许多不同变体(包括lookback/forward),但没有一个能给我预期的结果


    关于如何改进这一点,你有什么想法吗?

    这似乎很管用:

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


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

    String regex=“\”(?:[^\“]\\\b\“\\b)+\“\\\\S+”;
    
    试试这个正则表达式:


    <代码>(?):(怎么可能有一个字符串覆盖了<代码> >“<代码>有多个<代码>”/代码> s?它不会直接考虑<代码> W1W<代码>作为一个词,而不是<代码> W1W“2 < /代码>?也许我误解了您的问题,但我认为您可能会有一个矛盾的要求:“一个词内的双引号必须被忽略”。.Java正则表达式中的一个单词被定义为

    [A-Za-z0-9\]
    (请参阅),因此你不能在一个单词中有
    ”…试试
    String pat=“\”[^\”]*(?:\\b\“\\b[^\”]*)*“\\\\\\\\\S+”
    @拖拉者;@anothernode:你在Java正则表达式中对单词的严格定义是正确的,我这里的意思是将单词一分为二“,这仍然应该被视为一个单引号(让我传递定义)…word。我认为根据预期的输出1和6,不需要周围的双引号。@Gurman True,但我无法找到忽略周围引号的解决方案。不过,这可以很容易地在第二个短语中完成。仅供参考
    “\”(?:[^\”]\\\b\\\b)+\“| \\S+”
    将匹配与相同的字符串,但此字符串将稍慢一点。@WiktorStribiżew True,good point。那么,请随意添加您的字符串作为答案;)你找到忽略周围引号的方法了吗?@sp00m这是不可能的。只需使用一个捕获组,如果它不为空,则添加到最终的字符串列表中。最后,我对此进行了轻微的自定义。谢谢。
    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));
            }
        }
    
        }
    }