【问题标题】:(Pattern and Matcher) not discovering all pattern matches(模式和匹配器)没有发现所有模式匹配
【发布时间】:2013-07-21 13:12:38
【问题描述】:

我有这个字符串对象,它由标签(以 [$ 和 $] 为界)和其余文本组成。我试图隔离所有标签。 (Pattern-Matcher) 正确识别所有标签,但其中两个标签合二为一。我不知道为什么会这样,可能是一些内部(Matcher-Pattern)业务。

String docBody = "This is sample text.\r\n[$ FOR i 1 10 1 $]\r\n This is" +
            "[$ i $]-th time this message is generated.\r\n[$END$]\r\n" +
            "[$ FOR i 0 10 2 $]\r\n sin([$= i $]^2) = [$= i i * @sin \"0.000\"" +
            " @decfmt $]" +
            "\r\n[$END$] ";

Pattern p = Pattern.compile("(\\[\\$)(.)+(\\$\\])");
Matcher m = p.matcher(docBody);

    while(m.find()){

        System.out.println(m.group());

            }

output:

[$ FOR i 1 10 1 $]
[$ i $]
[$END$]
[$ FOR i 0 10 2 $]
[$= i $]^2) = [$= i i * @sin "0.000" @decfmt $]
[$END$]` 

如你所见,这部分[$= i $]^2) = [$= i i * @sin "0.000" @decfmt $]并没有分成[$= i $][$= i i * @sin "0.000" @decfmt $]这两个标签

有什么建议为什么会发生这种情况?

【问题讨论】:

    标签: java regex parsing matcher


    【解决方案1】:

    你应该使用 不情愿的量词 - ".+?" 而不是 greedy - ".+" :

    "(\\[\\$).+?(\\$\\])"  // Note `?` after `.+`
    

    如果您使用.+,它将匹配除行终止符 之外的所有内容,直到最后一个$。请注意,点 (.) 匹配除换行符以外的所有内容。对于不情愿的量词.+? 只匹配到它遇到的第一个 $]

    在你给定的字符串中,你得到了所有这些匹配,因为你在两者之间有\r\n.+ 停止匹配。如果您删除所有这些换行符,那么您只会得到一个从 1st[$ 到最后一个 $] 的匹配项。

    【讨论】:

      【解决方案2】:

      一个好的方法是用否定字符类替换点,例如:

      Pattern p = Pattern.compile("(\\[\\$)([^$]++)(\\$])");
      

      (注意你不需要转义右方括号)

      但也许你只对标签的内容感兴趣:

      Pattern p = Pattern.compile("(?<=\\[\\$)[^$]++(?=\\$])");
      

      在这种情况下,内容就是整个匹配项

      【讨论】:

      • -1 for [^],a) 在 java 中无效,b) 即使有效,也不能解决 OP 的问题,反而会使情况变得更糟。
      • @Ingo。这在 Java 中是绝对有效的。并返回与 OP 想要的相同的结果。我说的是第一个。
      • @Ingo。这是完全有效的,因为您将括号放在 ^ 之后
      • 无效。 PatternSyntaxException: regular expression syntax: Unclosed character class near index 2 这就是我得到的Pattern.compile("[^]")
      • @Ingo:你忘记了右括号。
      猜你喜欢
      • 1970-01-01
      • 2012-11-14
      • 1970-01-01
      • 1970-01-01
      • 2019-05-08
      • 2019-05-26
      • 2021-11-06
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多