2010-03-03 3 views
2

Я пытаюсь поймать текст с помощью регулярного выражения. Я перечисляю коды следующим образом.StackOverflowError произошел с использованием java.util.regex.Matcher

Pattern p=Pattern.compile("<@a>(?:.|\\s)+?</@a>"); 
Matcher m = p.matcher(fileContents.toString()); 
while(m.find()) { 
    //Error will be thrown at this point 
    System.out.println(m.group()); 
} 

Если длина текста, который я хочу поймать, слишком длинная, система будет бросать мне StackOverflowError. В противном случае коды работают хорошо. Пожалуйста, помогите мне, как решить эту проблему.

+0

Насколько велика 'fileContents.toString()'? –

ответ

3

Точка и \s оба соответствуют пробельным символам. Это может привести к ненужному отступлению. Что такое do Вы хотите совместить? Наверное, любой персонаж, включая разрывы строк?

Тогда просто использовать ленивую точку с дот-спички-Newlines опция включена:

Pattern p=Pattern.compile("<@a>.+?</@a>", Pattern.DOTALL); 

Вы знаете, что вы столкнетесь с проблемами, если <@a> теги могут быть вложены в ваш вклад?

+1

На самом деле, точки возврата являются, вероятно, тем, что вызывает переполнение стека. –

+1

Вот что я имел в виду (не увидев текст, который нужно сопоставить). Спасибо за разъяснения :) –

-1
I always try to search text with case insensitive.. 
Pattern p=Pattern.compile("<@a>.+?</@a>", Pattern.DOTALL | Pattern.CASE_INSENSITIVE); 
Смежные вопросы