无法找到多线串的REGEX匹配

时间:2017-11-02 23:29:20

标签: java regex string-matching

我正在尝试使用正则表达式来搜索字符串以查找多行模式。字符串的一个示例是:

!
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来匹配字符串。任何帮助将不胜感激。

1 个答案:

答案 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]+
    • .* - 其余部分。

Java demo

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]