我正在尝试使用正则表达式来搜索字符串以查找多行模式。字符串的一个示例是:
!
map-class frame-relay TempMap_1
frame-relay cir 1536000
frame-relay bc 15360
frame-relay mincir 281000
frame-relay adaptive-shaping becn
service-policy output AB_TEMP_F1536K_0-256K-384K-128K_18
logging trap debugging
logging source-interface Loopback1
logging 136.91.111.21
我想要提取的匹配字符串是
map-class frame-relay TempMap_1
frame-relay cir 1536000
frame-relay bc 15360
frame-relay mincir 281000
frame-relay adaptive-shaping becn
service-policy output AB_TEMP_F1536K_0-256K-384K-128K_18
我有的模式
map-class frame-relay TempMap_1[]*
Pattern pattern = Pattern.compile("map-class frame-relay TempMap_1[]*", Pattern.DOTALL);
我不太确定在[]中使正则表达式起作用。我正在使用Java和Pattern.DOTALL来匹配字符串。任何帮助将不胜感激。
答案 0 :(得分:2)
使用Java 8 ,您可以在此处使用缩进并使用
String regex = "map-class frame-relay TempMap_1.*(?:\\R\\h+.*)*";
请参阅regex demo。 NOT 使用Pattern.DOTALL
这种模式。
<强>详情
map-class frame-relay TempMap_1
- 文字子字符串.*
- 其余部分(?:\\R\\h+.*)*
- 0+连续序列:
\\R
- 一个换行符序列(在Java 7中,使用(?:\r\n?|\n)
,它就足够了)\\h+
- 1+个水平空格(在Java 7中,使用[^\\S\r\n]+
).*
- 其余部分。String s = "!\nmap-class frame-relay TempMap_1\n frame-relay cir 1536000\n frame-relay bc 15360\n frame-relay mincir 281000\n frame-relay adaptive-shaping becn\n service-policy output AB_TEMP_F1536K_0-256K-384K-128K_18\nlogging trap debugging\nlogging source-interface Loopback1\nlogging 136.91.111.21";
Pattern p = Pattern.compile("map-class frame-relay TempMap_1.*(?:\\R\\h+.*)*");
Matcher m = p.matcher(s);
List<String> res = new ArrayList<>();
while(m.find()) {
res.add(m.group());
}
System.out.println(res);
输出:
[map-class frame-relay TempMap_1
frame-relay cir 1536000
frame-relay bc 15360
frame-relay mincir 281000
frame-relay adaptive-shaping becn
service-policy output AB_TEMP_F1536K_0-256K-384K-128K_18]