我在文件中包含以下模式n次:
ENUM CMF_QUOTE_EVENT
CMF_QUOTE_EVENT_Activate "Activate"
CMF_QUOTE_EVENT_Suspend "Suspend"
CMF_QUOTE_EVENT_Delete "Delete"
ENDENUM
我的目标是捕获枚举的所有值。基本上我需要关键字“ENUM”和“ENDENUM”之间的三行。
我尝试使用Multiline Regex,但我仍然无法抓住它。 这是我做到的:
BufferedReader br = new BufferedReader(new FileReader(file));
String line = "";
StringBuilder sb = new StringBuilder();
while ((line = br.readLine()) != null)
{
sb.append(line.replace("\\s",""); // delete tabs and ws
}
Pattern pattern= Pattern.compile("ENUM(.*)(.|\\s)*ENDENUM", Pattern.MULTILINE);
Matcher match = pattern.matcher(sb.toString());
while (match.find())
{
// do something
}
br.close();
我想知道使用语法,但是这个用途看起来很重。我可以用正则表达式做这种事吗?
谢谢大家
答案 0 :(得分:0)
如果您选中 documentation :
默认情况下,正则表达式^和$忽略行终止符,并且仅分别匹配整个输入序列的开头和结尾。如果激活MULTILINE模式,则^在输入开始时和任何行终止符之后匹配,但输入结束时除外。当处于MULTILINE模式时,$匹配在行终止符之前或输入序列的结尾。
因此,多行标志不是捕获多行而是修改锚点行为。
您要使用的是捕获多行,因此您需要修改.
行为。为此,您必须使用Pattern.DOTALL
标志
Pattern pattern = Pattern.compile("ENUM(.*?)ENDENUM", Pattern.DOTALL);
<强> Working demo 强>
你必须从捕获组1获取内容:
Matcher match = pattern.matcher(sb.toString());
while (match.find())
{
// do something
String enumContent = match.group(1);
}