PatternSyntax Exception,在索引0附近悬挂元字符'+'

时间:2014-12-23 03:54:30

标签: java arrays exception pattern-matching matcher

我出于某种原因尝试使用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字符串只是一些字词或字符,在任何情况下都不是+  或*等。

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

修改

我使用了 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条件有什么关系还是什么?

2 个答案:

答案 0 :(得分:1)

您不应该使用StringBuffer(自Java 1.5以来,StringBuilder已被首选)。此外,您的Pattern未被重复使用;所以编译它似乎毫无意义。最后,如果您只想测试您的node是否与循环中的某些“测试”匹配,我建议您使用类似

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

答案 1 :(得分:0)

您不需要使用循环计数器只需使用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));
        }

    }