我需要从以下示例中提取文本,如下所示 - 示例文本 -
Link speed type is OK, link duplex type is DOWN
Unknown-speed mode, Link speed type is OK, Flow-control is disabled
Link speed type is OK, link duplex type is DOWN, Flow-control is disabled
从此我想提取以链接速度开始的行(它可以在行开始或在中间行)直到流控制...(此部分可以存在或不存在)。
所以期望的输出就像这样 -
Link speed type is OK, link duplex type is DOWN
Link speed type is OK
Link speed type is OK, link duplex type is DOWN
表示第一行和第三行已满,而第二行仅表示链接速度部分,不包括逗号和流量控制部分。 我尝试了几种方法..
^\s*(?:.*,)?\s*(Link speed.*)
问题 - 这选择第二行直到结束。
^\s*(?:.*,)?\s*(Link speed.*(?=\W*Flow-control))
它不会选择没有流量控制的第一行。
答案 0 :(得分:2)
最简单的方法是使用非贪婪修饰符?
:
(Link speed.*?)(Flow-control|$)
这将匹配从'Link speed'
到'Flow-control'
或行尾的所有内容。
答案 1 :(得分:1)
您可以尝试使用以下正面预测的正则表达式。
\bLink speed\b.*?(?=\bFlow-control\b|$)
.*?
将匹配字符串Flow-control
(如果它存在),否则这将匹配到行结束的所有字符。
或强>
要获得您期望的输出而不使用逗号,
\bLink speed\b.*?(?=,\s*\bFlow-control\b|$)
在java中,您需要使用Pattern
和Matcher
类来提取特定的子字符串。
Pattern p = Pattern.compile("(?m)\\bLink speed\\b.*?(?=,\\s*\\bFlow-control\\b|$)");