2012-01-18 2 views
1

я ищу шаблон для нескольких линийRegex для нескольких линий

Я новичок в Regex и в большой степени с помощью их использования в моем проекте

мне нужно придумать шаблон, который будет соответствовать несколько группа линий. Шаблон должен

матч либо эти линии

* Source: Test      * 


*         * 

или

Ord. 429 Tckt. 1 

или

Guest: 

Да, это не ясно. Я получил образец для второй линии (Ord 429 Tckt 1..), Которая:

[\s]+[\w]+[\.][\s]+[\d]+[\s]+[\w]+[\.][\s]+[\d]+ 
+0

зачем вам нужно один регулярное выражение для этих трех совершенно разных вещей? не лучше ли разделить его на три разных выражения? – apines

ответ

0

Я предполагаю, что вы используете Java. Вы бы использовали java.util.Regex. Возможно, вы ищете флаг Pattern.DOTALL на Pattern. Это относится к терминаторам строк как к символу, который можно совместить с ..

Pattern.compile ("^ * \ sSource: Test \ s ** \ s *", Patther.DOTALL);

Это зависит от того, насколько строго вы хотите быть, но выше будет соответствовать первая строка в первом фрагменте (включая терминатор строки).

Если вам нужна дополнительная помощь с API или это неправильный API, отредактируйте свой вопрос, чтобы быть более четким.

Вы пытаетесь сопоставить все три в одном регулярном выражении? Это можно сделать, но паттерн будет немного уродливым. Возможно, я тоже смогу помочь с этим.

Приличный тестер регулярных выражений: http://www.fileformat.info/tool/regex.htm. Вы можете сделать поиск Google для чего-то вроде regex java tester.

Только одна вещь, рисунок внизу не будет делать то, что вы хотите, если я полностью пойму.

[\ s] + соответствует одному или нескольким пробелам, поэтому на передней панели требуется пропустить пробел. Кроме того, вам не нужны квадратные скобки. Они работают, но необходимы только для чередования. Если вы хотите соответствовать a или b, но не обоим: [ab]. Но, если вы хотите соответствовать только a, вы просто положили a в свой шаблон.

\ s + одно или несколько пробелов \ w + один или несколько символов слова (без цифр или знаков препинания и т. Д.) . период \ s + некоторые пробелы \ d + некоторые цифры \ s + некоторые пробелы \ w некоторые слова символы . период \ s + пустые строки \ d + одна цифра

так, \s+\w+\.\s+\d+\s+\w+\.\s+\d+

Есть ли предполагается, что пустые строки в между Source: Test и линией с только звезды?

Вы собираетесь в конечный итоге с чем-то вроде этого:

(?:       # non-capturing group 
\s*\* Source: Test\s+\*  # first line of the of the first block 
\s+\*\s+\*     # second line, assuming that there is no space 
          #  between lines or an arbitrary amout of whitespace 
)       # end of first group 
|       # or.... 
(?:       # second group (non capturing) 
\s+\w+\.\s+\d+\s+\w+\.\s+\d+ # what we discussed before for Org/Tckt 
) 
| 
(?:\s+Guest:)    # the last one is easy :) 

Вы можете или не можете знать это, но комментарии, как я там может быть помещены в ваш код с помощью флага Pattern.COMMENTS. Некоторым это нравится. Я также разбил разные группы на свою собственную константу, а затем приклеил их вместе при компиляции patter. Мне это очень нравится.

Надеюсь, все это поможет.

+0

Я постараюсь быть яснее. Шаблон должен соответствовать трем различным экземплярам: Первый экземпляр - любая строка, начинающаяся с одного или пробела и содержащая только слово Guest: Второй экземпляр - это любая строка, начинающаяся с одного или нескольких пробелов, за которым следует эта фраза (Ord. 429). Tckt.1) и только эта фраза. Третий экземпляр должен соответствовать этим как: * Источник: Test * * * – Leger

+0

Да, Джефф. Я пытаюсь сопоставить все три в одном регулярном выражении. – Leger

+0

Вы имели в виду 1 или больше пробелов в начале? Так что это не удается, если перед «Ордом» нет пробелов? –

1

Если вам нужен один большой регулярное выражение, чтобы соответствовать всем этим, следующее должно работать, если у вас есть Pattern.DOTALL и Pattern.MULTILINE флаги установлены (см Rubular):

^\*[^\n]*\*$.*?^\*[^\n]*\*$|^\w+\.[ \t]+\d+[ \t]+\w+\.[ \t]+\d+$|^Guest:[^\n]*$ 

Вот разбивка различных секций (раскол по |):

Ваша первая группа линий:

^\*[^\n]*\*$.*?^\*[^\n]*\*$ 
--------------------------- 
^    # start of a line 
\*   # a literal '*' 
[^\n]*  # any number of non-newline characters  
\*   # a literal '*' 
$    # end of a line 
.*?   # any number of characters, as few as possible (includes newlines) 
^\*[^\n]*\*$ # repeat of the first six elements of pattern as described above 

СЕКУНДА ond line (для строк типа Ord. 429 Tckt. 1 ') адаптируется с вашей стороны с некоторыми незначительными изменениями.

^\w+\.[ \t]+\d+[ \t]+\w+\.[ \t]+\d+$ 

Что касается третьего, она должна быть довольно простой, начало строки, затем «Гость:», а затем любое число не-символов новой строки.

^Guest:[^\n]*$ 
+0

Спасибо F.J., но я пытаюсь сопоставить все три с одним регулярным выражением. – Leger

+0

Да, похоже, это работает на http://www.rubular.com/r/RiPgU7DPHO. Но он еще не работает над моей тестовой ссылкой. Я установил флаги MULTIPLE LINES и DOTALL. Он тоже должен работать – Leger

+0

Кстати, вам нужно 'Pattern.MULTILINE', только если вы хотите использовать' $ 'для конца строк.Если вы можете использовать пробельные шаблоны, вы можете просто использовать 'Pattern.DOTALL'. –

0

Добавить переключатель многострочного (?s) в переднюю части регулярных выражений:

(?s)[\s]+[\w]+[\.][\s]+[\d]+[\s]+[\w]+[\.][\s]+[\d]+ 
+0

Зачем? В этом регулярном выражении нет ничего, что повлияет на многострочный режим. Кроме того, '(? S)' включает режим DOTALL (или однострочный). '(? m)' является модификатором MULTILINE. –

+0

@AlanMoore На самом деле вы там неверны - все наоборот. См. [Эту страницу] (http://www.regular-expressions.info/refadv.html) – Bohemian

+0

Неправильно о том, что именно? Multiline изменяет значение стартовых и конечных якорей ('^' и '$'), а однострочный/DOTALL изменяет значение точки ('.'). Поскольку в вашем регулярном выражении нет якорей или неэкранированных точек, оба режима не имеют значения. И, хотя эта страница не говорит прямо, что '(? M)' == multiline и '(? S)' == single-line/DOTALL, описания дают понять, что есть. –