无法找到多行字符串的正则表达式匹配
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]+
)
.*
- 该行的其余部分。
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]
我正在尝试制作正则表达式以在字符串中搜索多行模式。字符串的一个例子是:
!
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]+
).*
- 该行的其余部分。
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]