【问题标题】:PatternSyntax Exception,Dangling meta character '+' near index 0模式语法异常,在索引 0 附近悬空元字符“+”
【发布时间】:2014-12-23 03:54:30
【问题描述】:

出于某种原因,我尝试使用 Matcher,但有时它给了我 PatternSyntax Exception 。我知道在我的情况下,这意味着 + 是一个保留字符,应该转义它。但我的字符串中根本没有这样的字符:

        Pattern p=Pattern.compile(test,Pattern.CASE_INSENSITIVE);
        StringBuffer testing=new StringBuffer (node.getNodeValue());
        matcher=p.matcher(testing);
        if(!matcher.hitEnd())
             {
         if(matcher.find())
          {

          i++;
          }
               }

Pattern p=Pattern.compile(test,Pattern.CASE_INSENSITIVE);抛出异常

test 字符串只是一些单词或字符,在任何情况下都不是+*等。

这里是 test 将在 for 循环中替换为它们的单词列表:

编辑

我使用了 Elliott Frisch 的答案,但是现在发生了一个奇怪的异常:

         for(int j=0;j<index2;j++)
                  {
    test = (test != null) ? test.toLowerCase() : null;
str = (str != null) ? str.toLowerCase() : "";
if (str.contains(test)) 
{


           X[Index]= keArrayList.indexOf(test);
                Index++;
            }   

  }

             int[] X=new int[100000];

           private static final double[]  Y=new double[100000];

              for(int i=0;i<Index;i++)
             {
        felan=Y[X[i]];

             }

虽然两个循环索引都比100000 小得多,但在第一次迭代中我得到了这个:

Exception in thread "main" java.lang.ArrayIndexOutOfBoundsException: -1

这是否与 if 条件或什么有关?

【问题讨论】:

  • test 到底是什么?
  • 正如我在问题中解释的,这是我从随机网页中提取的一些单词
  • 了解实际内容很重要。
  • 它是一个很长的列表,它因页面而异,但如果你愿意,我可以向你展示一个给出这个例外的页面
  • @lonesome 我们不需要查看您的列表,我们需要查看您的模式。

标签: java arrays exception pattern-matching matcher


【解决方案1】:

您不应该使用StringBufferStringBuilder 自 Java 1.5 以来一直是首选)。此外,您的 Pattern 没有被重复使用;所以编译它似乎毫无意义。最后,如果您只想测试您的 node 是否与循环中的一定数量的“测试”匹配,我建议您使用类似

String str = node.getNodeValue();
test = (test != null) ? test.toLowerCase() : null;
str = (str != null) ? str.toLowerCase() : "";
if (str.contains(test)) {
    i++;
}

【讨论】:

  • 好的,我用了你的答案,但是,虽然我不确定,但还有另一个例外发生。在此之后,如果我使用了一个 for 循环,该循环使用上面 if 中分配的变量。虽然 idex 足够高,但在第一次迭代中它给了我数组超出范围的异常。我在我的问题中更新了它。也许你可以看看这是否与这个答案有关
  • X[I] 不是 Y 的有效索引。这是一个新问题。
  • 明白了。但为什么它无效?既然 X[i] 的值不会超过 Y[] 维度,那它是如何变得无效的呢?
  • @lonesome 如果你得到一个索引超出范围的异常,那么它会(根据定义) - 如果它是负数或大于 Y.length 你会得到那个异常。
  • 是的,由于 Y[] 长度很大,我想知道是否还有其他原因导致您提到负索引的异常,是的,情况就是这样
【解决方案2】:

您不需要使用循环计数器,只需使用 while 语句...只需在匹配器找到匹配项时打印结果...您的错误可能是由于 if 条件的增量...没有在没有初始化变量的 if 语句中本机递增。但是你并没有透露所有的代码,所以我只是假设......

此外,我不知道编译参数“test”是文字值还是变量,但参数需要a regular expression

    public static String list = "..."; // long list..

    public static void main( String[] args ) {

        Pattern pattern = Pattern.compile( ".+" ); // some pattern 

        Matcher matcher = pattern.matcher( list );

        while( matcher.find() ) {
            System.out.println( matcher.group(0));
        }

    }

【讨论】:

  • 我已经透露了所有包含 patternmatcher 的代码,没有别的了。实际上,我阅读了网页内容,然后尝试将其内容与关键字进行匹配,当匹配发生时,索引会增加。像这样的东西。 i 是一个整数,用于计算发生的匹配次数
  • @lonesome 字符串文字“test”不是有效模式。模式是一个 Java 正则表达式。您需要阅读语法。 Java RegEx Pattern
  • 我知道,但我只是想让模式像一个单词一样简单。我做错了吗?
  • @lonesome 请查看更新后的答案... Pattern.compile 将字符串正则表达式作为参数...
  • 我看到了更新。所以你的意思是使用 string 是错误的?
猜你喜欢
  • 2017-03-07
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-07-21
  • 1970-01-01
  • 1970-01-01
  • 2013-09-06
  • 1970-01-01
相关资源
最近更新 更多