2013-06-23 2 views
0

У меня есть следующий текст:Regular Expression необходимую помощь для извлечения текста из строк

:10A: <any characters here>\r\n 
<any characters here>\r\n 
<any characters here>\r\n 
. 
. 
. 
:11A: or :12P: 

Там может быть до 10 строк между двумя «: XXX:» знаки (в том числе в первом ряду). Мне нужно извлечь (используя только REGEX, не методы Java) от первой до четырех строк (включая первую строку, без «: 10A:»).

Примеры 1:

:10A: Line number 1\r\n 
Line number 2\r\n 
Line number 3\r\n 
Line number 4\r\n 
Line number 5\r\n 
Line number 6\r\n 
:11A: 

извлечет:

Line number 1\r\n 
Line number 2\r\n 
Line number 3\r\n 
Line number 4\r\n 

Пример 2:

:10A: Line number 1\r\n 
Line number 2\r\n 
:12P: 

извлечет:

Line number 1\r\n 
Line number 2\r\n 

Любая помощь будет принята с благодарностью.

Спасибо.

+0

@Elist, это может или не может быть намеком: «... только Regex, ни методы Java» – doubleDown

+0

Конечно, удалено ... – Elist

+0

Прочтите учебное пособие по Java Regex. http://docs.oracle.com/javase/tutorial/essential/regex/index.html Тогда, может быть, вы можете закодировать свои собственные регулярные выражения, вместо того, чтобы заставить SO-читателей выполнять вашу работу за вас. –

ответ

0

Может быть регулярное выражение, чтобы начать с:

:(?:.*?):((?:.*?[\r\n]){1,4})(?:.*?):(?:.*?): 

Первая группа соответствия будет возвращать до четырех строк текста.

Важное примечание: необходимо включить опцию «dotall» в Java, как в Pattern.compile(pStr, Pattern.DOTALL) или подобный вариант (режим однострочный /.../s в Perl или RegexOptions.Singleline в .NET), в противном случае регулярное выражение не будет работать из-за тот факт, что вы работаете над многострочными данными.

+0

, учитывая указанное выше выражение, вам не нужно использовать опцию dotall, так как '.' никогда не будет соответствовать новой строке из-за' [\ r \ n] ' – Anirudha

+0

@Anirudh Это интересно, потому что я попробовал это в RegExr, и это только работал с параметром DOTALL, хотя я думал, что он должен работать без него, учитывая тот же аргумент, который вы дали. – jCoder

1

Вы можете использовать это регулярное выражение

(?<=:.{3}:)(.*?(\\r?\\n)){1,4} 
1

Описание

Это выражение будет захватывать первые 4 строки текста каждого раздела.

^:[^:]*:(.*?(?:^(?:(?!^:[^:]*:|[\r\n]|\Z).)*[\r\n\Z]*){3})

enter image description here

Expanded

  • ^:[^:]*: матч секция перерыв
  • .*? матч строка текста на той же линии, что и разрыв раздела
  • (? этот захват группы будет соответствовать всей строке ч не раздел перерыв
    • ^ матч начало линии
    • (?:(?!^:[^:]*:|[\r\n]|\Z).)* матч все символы на линии условии, что они не являются заголовок раздела, символы новой строки или конец строки
    • [\r\n\Z]* соответствуют любому числу новых символов строки или концу строки
    • ){3} попытка сопоставить три из этих строк. Обратите внимание, что внутреннее условие автоматически ограничено и предотвратит захват большего количества строк, которые могут содержать разделы.

Java Пример кода:

Введите текст

:10A: Line number 1 
Line number 2 
Line number 3 
Line number 4 
Line number 5 
Line number 6 
:11A:Line number 1 
Line number 2 
Line number 3 
Line number 4 
:10A: Line number 1 
Line number 2 
:12P:Line number 1 
Line number 2 

Код

import java.util.regex.Pattern; 
import java.util.regex.Matcher; 
class Module1{ 
    public static void main(String[] asd){ 
    String sourcestring = "source string to match with pattern"; 
    Pattern re = Pattern.compile("^:[^:]*:(.*?(?:^(?:(?!^:[^:]*:|[\r\n]|\Z).)*[\r\n\Z]*){3})",Pattern.CASE_INSENSITIVE | Pattern.MULTILINE | Pattern.DOTALL); 
    Matcher m = re.matcher(sourcestring); 
    int mIdx = 0; 
    while (m.find()){ 
     for(int groupIdx = 0; groupIdx < m.groupCount()+1; groupIdx++){ 
     System.out.println("[" + mIdx + "][" + groupIdx + "] = " + m.group(groupIdx)); 
     } 
     mIdx++; 
    } 
    } 
} 

соответствий Это только показывает захват группе 1. Захват группа 0 является полным соответствием строки

$matches Array: 
(
    [1] => Array 
     (
      [0] => Line number 1 
Line number 2 
Line number 3 
Line number 4 

      [1] => Line number 1 
Line number 2 
Line number 3 
Line number 4 

      [2] => Line number 1 
Line number 2 

      [3] => Line number 1 
Line number 2 
     ) 

)