2012-01-17 2 views
1

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

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. 

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

+0

Что такое t ext вы пытаетесь захватить и какой текст/строку вы хотите пропустить? – anubhava

+0

«Государство совета» для каждого «SLOT» i.e. «SLOT 2 - Board State - Val», «SLOT 3 - Board State имеет значение Val2» и так далее. Есть несколько 'SLOT', я здесь только 2 здесь. – theking963

ответ

0

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

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

Спасибо, это именно то, что я искал! – theking963

+0

Добро пожаловать, рад, что это сработало. – anubhava

0

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

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

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

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

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

Я не использую '^' перед регулярным выражением. Я использую его перед 'group', поскольку в тексте, который я не хочу, есть' subslots'. Я хочу только «SLOT», который находится в начале строки. У вас есть незакрытый '' 'и' нераскрытый 'или '' '' '' ''. – theking963

+0

Вы правы, исправил ответ. –

+0

Нет совпадения. Я изменил ваш ответ на 'regex = '(SLOT \\ s * \\ d +) \\ s * \\ ([^ \\)] + \\) \\ s *: \\ s * \\ S * ([^ \ n \ r] + [\ n \ r]) * (Board) [^ \ n \ r] * ";' (добавлена ​​группа() в слот и доска), поскольку мне нужно сохранить ее в группе и добавьте его на карту. Он не входит внутрь 'while (matcher.find())'. Я добавлю дополнительные две строки в свой вопрос, чтобы показать код. – theking963

Смежные вопросы