2014-08-31 1 views
0

Я понимаю, что это может быть дубликат, но я не нашел ответа, который удовлетворяет этому вопросу. У меня есть большая строка, настроенная как так:Найти все строки между двумя строками несколько раз

сезон
содержания контент содержания содержания содержания
сезон
содержание содержания содержания содержание содержания
сезон
содержание содержания содержания содержание содержания

и т.д.

Я хочу получить весь контент между строкой «сезон» и поместить это содержимое в список. Это мой код до сих пор, но он не работает, он ничего не найдено ...

String pattern = "season"; 
    Pattern pattern2 = Pattern.compile(pattern+"(.*?)"+pattern); 
    Matcher m = pattern2.matcher(str); 
    while(m.find()) { 
     System.out.println(m.group()); 

Когда я использую StringUtils.substringBetween() он работает, но мне нужно, чтобы получить каждую строку между двумя «сезона "струны.

+1

ли эти новые линии? –

ответ

1

Лучше всего использовать lookahead, чтобы утверждать либо season, либо конец строки следует. Кроме того, если последовательности строк новой строки находятся между шаблоном, который вы хотите использовать флаг dotall, и точка . также соответствует символам новой строки.

String s = "season\nfoobar foobaz\n\nseason\nbarbaz\nseason\nbazquz"; 
Pattern p = Pattern.compile("(?s)season\\s*(.*?)(?=\\s*season|$)"); 
Matcher m = p.matcher(s); 
List<String> arrayList = new ArrayList<String>(); 
while (m.find()) { 
    arrayList.add(m.group(1)); 
} 
System.out.println(arrayList); // [foobar foobaz, barbaz, bazquz] 
0

Это должно работать тоже -

import java.util.ArrayList; 
import java.util.List; 

public class Season { 

    public static void main(String[] args) { 
     // TODO Auto-generated method stub 
     String largeString = "season content content content content content season content content content content content season content content content content content"; 
     List<ArrayList<String>> lists = getStringBetweenSeason(largeString); 
     for (ArrayList<String> list : lists) { 
      for (String str : list) 
       System.out.println(list); 
     } 

    } 

    public static List<ArrayList<String>> getStringBetweenSeason(
      String largeString) { 
     if (largeString == null) 
      return null; 
     List<ArrayList<String>> lists = new ArrayList<ArrayList<String>>(); 
     for (String str : largeString.split("season")) { 
      if (!str.trim().isEmpty()) { 
       ArrayList<String> list = new ArrayList<String>(); 
       for (String strContent : str.split(" ")) { 
        list.add(strContent); 
       } 
       lists.add(list); 
      } 
     } 
     return lists; 
    } 
} 

----- Если сопоставление с образцом цель - то это похоже на работу тоже ..

public static ArrayList<String> getStringBetweenSeason(String largeString) { 
     if (largeString == null) 
      return null; 
     ArrayList<String> lists = new ArrayList<String>(); 
     Pattern p = Pattern.compile("season" + "*.*" + "season"); 
     Matcher m = p.matcher(largeString); 

     while (m.find()) { 
      lists.add(m.group()); 
     } 

     return lists; 
    } 
+0

'сезон *. * Сезон' Совпадения' seaso некоторый текст примечание неполный первый wordseason' ... – AlexR