正则表达式 - 跳过一行或多行

时间:2012-01-17 20:10:00

标签: java regex

我需要解析以下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 :(得分: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]*)";

答案 1 :(得分: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]