代码之家  ›  专栏  ›  技术社区  ›  user7162210

Java/RegEx-模式的否定不起作用

  •  3
  • user7162210  · 技术社区  · 7 年前

    我有绳子

    shape="box", fontsize = "130"fontstyle= " ITALIC " fillcolor=red";
    

    还有图案

    "(([^\\s,]+)((\\s*)=(\\s*)\"(.+?)\"))"
    

    当前匹配的

    shape="box"
    fontsize = "130"
    fontstyle= " ITALIC "
    

    我需要将这些匹配的字符串分离并存储在一个数组中。我想到的最简单的方法是使用字符串。拆分(反转模式),但是我很快意识到匹配特定模式的反转,这就是一切 但是 这种模式,似乎是一项相当艰巨的任务。到目前为止,我还没有找到一种适合我的方法。

    出于某种原因,既不是消极的前瞻,也不是

    ^((?!pattern).)*$
    

    (我经常认为这是解决我问题的办法)似乎奏效了。

    有什么方法可以做到我现在还没有看到?

    1 回复  |  直到 7 年前
        1
  •  1
  •   Sergey Kalinichenko    7 年前

    在您的示例中,为定界符创建模式并不实用,因为它需要在模式之外进行奇偶计数——这是Java正则表达式很难做到的。

    你的字符串就是一个很好的例子:当一个空格前面有偶数个双引号时,它就是一个分隔符;否则,它是引用值的一部分。

    而不是试图让你的表达适合与 split() 方法,制作一个模式匹配器,并重复调用它以将字符串解析为匹配块。 This Q&A 解释了如何用很少的代码来完成。

    List<String> chunks = new ArrayList<>();
    Matcher m = Pattern.compile("(([^\\s,]+)((\\s*)=(\\s*)\"([^\"]+)\"))")
         .matcher("shape=\"box\", fontsize = \"130\"fontstyle= \" ITALIC \" fillcolor=\"red\";");
    while (m.find()) {
         chunks.add(m.group());
    }