默认情况下,“。” 与换行符不匹配。 要匹配多行,请添加(?s)前缀或启用Pattern.DOTALL标志。
1.例子
一个地址样本,我们只需要提取“地址1”。
Starting...
Address 1: 88 app 2/8
superman taman, puchong
36100, Malaysia
Address 2: abc
End
失败:
要提取“地址1”,此模式将不返回任何内容,即“。”。 与多行不匹配。
Address 1:\\s(.*)Address 2:
正确的:
要提取“地址1”,请添加(?s)前缀。
(?s)Address 1:\\s(.*)Address 2:
或启用Pattern.DOTALL模式。
Pattern.compile(Address 1:\\s(.*)Address 2:, Pattern.DOTALL);
2. RegEx示例
使用正则表达式多行匹配以获取“地址1”的示例。
package com.mkyong.regex
import java.util.ArrayList;
import java.util.List;
import java.util.regex.Matcher;
import java.util.regex.Pattern;
public class RunExampleTest{
private Pattern addressPattern = Pattern.compile(ADDRESS_PATTERN);
private Matcher matcher;
//Alternative
/*private Pattern addressPattern =
Pattern.compile(ADDRESS_PATTERN, Pattern.DOTALL);*/
private static final String ADDRESS_PATTERN = "(?s)Address 1:\\s(.*)Address 2:";
public static void main(String[] args) {
String data = "Testing... \n" +
"Address 1: 88 app 2/8\n" +
"superman taman, puchong\n" +
"36100, Malaysia\n" +
"Address 2: abc" +
"testing end";
RunExampleTest obj = new RunExampleTest();
List<String> list = obj.getAddress(data);
System.out.println("Test Data : ");
System.out.println(data + "\n");
System.out.println("Address Resut : " + list);
}
private List<String> getAddress(String data){
List<String> result = new ArrayList<String>();
matcher = addressPattern.matcher(data);
while (matcher.find()) {
result.add(matcher.group(1));
}
return result;
}
}
输出量
Test Data :
Testing...
Address 1: 88 app 2/8
superman taman, puchong
47100, Malaysia
Address 2: abctesting end
Result : [88 app 2/8
superman taman, puchong
47100, Malaysia
]
参考文献
标签: 正则表达式
翻译自: https://mkyong.com/regular-expressions/regular-expression-matches-multiple-line-example-java/