我需要解析以下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
。
答案 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]