Regex - пропустить одну или несколько строк - PullRequest
1 голос
/ 18 января 2012

У меня есть следующее String, которое мне нужно проанализировать. Я ищу Board State для каждого Slot номера.

Some lines...
SLOT  2 (RP/LC 2): Random Text
   MAIN:
   PCA:
... More text
Board State is Val
... More text

Some lines...
SLOT  3 (RP/LC 3): Random Text
   MAIN:
   PCA:
... More text
Board State is Val2
... More text
subslot 0/9/0

В настоящее время у меня есть это.

String regex = "(^SLOT\\s*\\d+).*\\s*.*\\s*.*\\s*.*\\s*.*\\s*.*\\s*.*\\s*.*\\s*.*\\s*.*\\s*.*\\s*.*\\s*.*\\s*.*\\s*.*\\s*.*\\s*.*\\s*.*\\s*(Board.*)";
Pattern pattern = Pattern.compile(regex);
Matcher matcher = pattern.matcher(commandOutput);

while(matcher.find()) {
     //Do Something
}

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

Можно ли сделать что-то вроде

regex = "(^SLOT\\s*\\d+)(.*\\s*)+(Board.*)"; //This obviously doesn't work. Find slot, then skip one or more lines until it finds Board. I am using \\s instead of \\r\\n because \\s skips tabs as well. 

Редактировать: Что касается именно то, что я хочу от регулярного выражения. Поместите SLOT # в группу и Board State is Val в другую группу для всех SLOTS.

Ответы [ 2 ]

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

Я бы предложил использовать это упрощенное регулярное выражение для вашей задачи, например:

Matcher m = Pattern.compile("SLOT\\s+(\\d+).*?Board\\s+State\\s+is\\s+(\\w+)",
            Pattern.DOTALL).matcher(text);
while(m.find())
    System.out.printf("Slot is [%s], Board is [%s]%n", m.group(1), m.group(2));

ВЫХОД:

Slot is [2], Board is [Val]
Slot is [3], Board is [Val2]
0 голосов
/ 18 января 2012

Это должно сделать работу:

String regex = "(SLOT\\s*\\d+)\\s*\\([^\\)]+\\)\\s*:\\s*\\S*[\n\r](\\s*[^\n\r]+[\n\r])*(Board[^\n\r]*)";

Обратите внимание, что я использовал [^\n\r] вместо . на случай, если вы скомпилируете его с помощью DOTALL.Если нет, вы можете так же легко изменить каждый [^\n\r] на ..

Если после SLOT \d+ часть (something): something не обязательна, вы можете использовать один из них:

String regex = "(SLOT\\s*\\d+)[^\n\r]*[\n\r](\\s*[^\n\r]+[\n\r])*(Board[^\n\r]*)";
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...