2015-04-21 4 views
1

Мне нужно найти строку между двумя настраиваемыми заголовками.Поиск строки в строке с символами новой строки ( n)

Ниже приведена строка, с которой я работаю, и хочу, чтобы она могла извлекать часть строки между «--- BEGIN CGP MESSAGE --- \ n» и «--- BEGIN CGP KEY --- \ n ", или любой другой другой заголовок.

---BEGIN CGP MESSAGE---\n 
EoEZ1Qio8/BY/vl9iGblkg==\n 
---BEGIN CGP KEY---\n 
dOo23Ar23p4v6So70O65E6ImFnzuYrVro3nXFi5s4RUdczLITEDNcUefRiOgyEKWJKR/CW1DeLITPlT7RjV3FQRIz8sIdsW8Zuq9E4u6ad5n+EPxC80IfhdrThJPs/T6yuaVW3s+45mnyGMHvhEatwwkqtJZydfBKz3qb/JUkf0=\n 
---END CGP MESSAGE---\n 

Везде я выглядел предложил регулярное выражение, и он часто отформатирован, как это (я заменил пример они использовали с параметрами, которые я хотел)

String str = sb.toString(); 
Pattern pattern = Pattern.compile("---BEGIN CGP MESSAGE---(.*?)---BEGIN CGP KEY---"); 
Matcher matcher = pattern.matcher(str); 
while (matcher.find()) { 
System.out.println(matcher.group(1).toString()); 
} 

(С.Б. является строка-строитель, который построил строка выше.)

К сожалению, когда я запускаю этот код, он не печатает строку «EoEZ1Qio8/BY/vl9iGblkg ==», которую я хочу. У меня нет никаких ошибок; он просто ничего не печатает в консоли.

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

О, и я не могу использовать функцию разделения строк, которая полагается на целое местоположение символа. Строки между заголовками будут иметь разную длину, и поэтому программа должна быть в состоянии разместить для нее.

ответ

3

Вам нужно указать образец, чтобы рассмотреть linfeed для точки.

Pattern.compile("---BEGIN CGP MESSAGE---(.*?)---BEGIN CGP KEY---", Pattern.DOTALL); 
+0

Вот, спасибо. – Ryuluce

+0

@Ryuluce Добро пожаловать. –

+0

Что такое хороший способ создать строку регулярного выражения. Я имею в виду, что хочу иметь возможность вместо того, чтобы печатать «EoEZ1Qio8/BY/vl9iGblkg ==», использовать его как строковую переменную. определение строковой переменной в цикле «while» не работает, конечно. – Ryuluce

1

Вы можете добавить модификатор (?s) расставить все точки совпадает с новой строки:

(?s)---BEGIN CGP MESSAGE---(.*?)---BEGIN CGP KEY--- 

Demo