无法找到多行字符串的正则表达式匹配

Cant Find REGEX match for Multiline String

我正在尝试制作正则表达式以在字符串中搜索多行模式。字符串的一个例子是:

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

使用Java 8,你可以利用此处的缩进并使用

String regex = "map-class frame-relay TempMap_1.*(?:\R\h+.*)*";

regex demo不要使用Pattern.DOTALL这个模式。

详情

  • map-class frame-relay TempMap_1 - 文字子串
  • .* - 该行的其余部分
  • (?:\R\h+.*)* - 0+ 个连续序列:
    • \R - 一个换行序列(在Java7中,使用(?:\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]