2017-01-11 2 views
4

У меня есть большая строка, которая содержит многострочные подстановки между двумя постоянными маркерными строками, которые я могу идентифицировать с помощью регулярного выражения.Извлечь все подстроки, начинающиеся и заканчивающиеся регулярным выражением из большой строки

Для упрощения я назвал их abcdef и fedcba здесь:

abcdef Sed lobortis nisl sed malesuada bibendum. fedcba 
... 

abcdef Fusce odio turpis, accumsan non posuere placerat. 
1 
2 
3 
fedcba 

abcdef Aliquam erat volutpat. Proin ultrices fedcba 

Как я могу получить все вхождения включая маркеров из большой строки?

+0

'abcdef [\ s \ S] *? Fedcba' – ClasG

ответ

5

Что-то вроде

Pattern r = Pattern.compile("abcdef[\\s\\S]*?fedcba"); 
Matcher m = r.matcher(sInput); 
if (m.find()) { 
    System.out.println("Found value: " + m.group()); 
} 

где sInput является ваша строка для поиска.

[\s\S]*? будет соответствовать любому номеру любого символа до fedcba. Благодаря ? это не жадный матч, что означает, что он не будет продолжаться до последнего fedcba (как если бы он был жадным), тем самым давая вам отдельные строки.

+0

Это хорошее начало, но, похоже, найдено только первое совпадение (строка). – yglodt

+1

Я действительно не * говорю * java (просто googler;), но я думаю, вы могли бы просто заменить 'if (m.find()) {' with 'while (m.find()) {'. Проверьте этот ответ: http://stackoverflow.com/a/16817458/2064981 – ClasG

+0

Существует еще одна спецификация, о которой я забыл упомянуть. abcdef всегда должен быть началом строки. Как добавить это в шаблон? – yglodt

1

REGEXP:

(?:\babcdef)(?:.*\n)*(?:\bfedcba) 

JAVA:

import java.util.regex.Matcher; 
import java.util.regex.Pattern; 

final String regex = "(?:\\babcdef)(?:.*\\n)*(?:\\bfedcba)"; 
final String string = "patata\n" 
    + "abcdef\n" 
    + "Aliquam erat volutpat. Proin ultrices\n" 
    + "Testing\n\n" 
    + "test[](test)\n" 
    + "Testing\n" 
    + "fedcba\n" 
    + "Testing\n\n\n\n"; 

final Pattern pattern = Pattern.compile(regex, Pattern.MULTILINE); 
final Matcher matcher = pattern.matcher(string); 

while (matcher.find()) { 
    System.out.println("Full match: " + matcher.group(0)); 
    for (int i = 1; i <= matcher.groupCount(); i++) { 
     System.out.println("Group " + i + ": " + matcher.group(i)); 
    } 
} 

Первоначальный текст:

patata 
abcdef 
Aliquam erat volutpat. Proin ultrices 
Testing 

test[](test) 
Testing 
fedcba 
Testing 

РЕЗУЛЬТАТ:

abcdef 
Aliquam erat volutpat. Proin ultrices 
Testing 

test[](test) 
Testing 
fedcba 

См:https://regex101.com/r/xXaLgN/5

Наслаждайтесь.

Не забывайте, что если я вам помогу, отметьте меня как ответ на вопрос.

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