2014-12-23 1 views
2

По какой-то причине я пытаюсь использовать Matcher, но иногда это дает мне PatternSyntax Exception. я знаю, что в моем случае это означает, что + является зарезервированным персонажем и должен избегать его. но моя строка не имеет такой характер, в нем вообще:PatternSyntax Exception, Dangling meta character '+' рядом с индексом 0

 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 будут заменены с ними для цикла:

EDIT

Я использовал ответ Elliott Фриша однако теперь странное исключение происходит:

  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 или что?

+1

Что такое 'test', точно? – August

+0

как я объяснил в вопросе, это некоторые слова, которые я извлек из случайной веб-страницы. – lonesome

+2

Важно знать _actual contents_. – August

ответ

1

Вы не должны использовать StringBuffer (StringBuilder было предпочтительнее, так как 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++; 
} 
+0

ok, я использовал ваш ответ, но, хотя я не уверен, но происходит другое исключение. сразу после этого, если im использует for-loop, который использует переменные, которые назначены в if, если выше. хотя идекс достаточно высок, но на первой итерации он дает мне массив из исключения. Я рассматриваю это в своем вопросе. возможно, вы можете посмотреть, связано ли это с этим ответом или нет. – lonesome

+0

X [I] не является допустимым индексом для Y. И это новый вопрос. –

+0

понимается. но почему это недействительно? так как значение X [i] не будет превышать размерность Y [], как это становится недействительным? – lonesome

0

Вам не нужно использовать счетчик циклов, просто используйте оператор while ... просто распечатайте результаты, пока совпадёт поиск совпадений ... Ваша ошибка, вероятно, связана с приростом в условии if ... есть нет инкрементально в выражении if без инициализированной переменной. Однако вы не раскрываете весь код, поэтому я просто предполагаю ...

Кроме того, я не могу определить, является ли аргумент компиляции «тестом» буквальным значением или переменной, но для этого параметра требуется 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)); 
     } 

    } 
+0

Я уже показал все коды, содержащие ** pattern ** и ** matcher **, нет другой вещи. на самом деле, я читаю содержимое веб-страницы, а затем пытаюсь сопоставить его контент с ключевым словом, когда происходит сопоставление, индекс увеличивается. что-то вроде этого. что ** i ** является целым числом для подсчета числа совпадений, которое произошло – lonesome

+0

@lonesome Строковый литерал 'test' не является допустимым шаблоном. Шаблон - это java RegEx. Вам нужно прочитать синтаксис. [Java RegEx Pattern] (http://docs.oracle.com/javase/7/docs/api/java/util/regex/Pattern.html) –

+0

Я знаю, но я просто попробовал сделать шаблон таким простым, как просто слово. я сделал это неправильно? – lonesome

 Смежные вопросы

  • Нет связанных вопросов^_^