Регулярное выражение для нескольких строк - PullRequest
1 голос
/ 18 января 2012

Я ищу шаблон для нескольких строк

Я новичок в регулярных выражениях и интенсивно использую их, используя в своем проекте

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

соответствовать либо этим строкам

* Source: Test                     *


*                                  *

, либо

Ord. 429 Tckt. 1

или

Guest:

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

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

Ответы [ 3 ]

1 голос
/ 18 января 2012

Если вам нужно одно большое регулярное выражение для соответствия всем этим, следующее должно работать, если у вас установлены флаги 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

Вторая часть строки (для строк типа 'Ord. 429 Tckt. 1') адаптирована из вашей с некоторыми незначительными изменениями.

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

Что касается третьего, то оно должно быть довольно простым: начало строки, за которым следует 'Guest:', а затем любое количество символов, не являющихся символом новой строки.

^Guest:[^\n]*$
0 голосов
/ 18 января 2012

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

(?s)[\s]+[\w]+[\.][\s]+[\d]+[\s]+[\w]+[\.][\s]+[\d]+
0 голосов
/ 18 января 2012

Я предполагаю, что вы используете 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флаг.Некоторым людям это нравится.Я также разбил различные группы на их собственные константы, а затем вставил их вместе при составлении шаблона.Мне это очень нравится.

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...