多行正则表达式java,还是语法?

时间:2017-10-11 15:12:47

标签: java regex java-8 grammar

我在文件中包含以下模式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();

我想知道使用语法,但是这个用途看起来很重。我可以用正则表达式做这种事吗?

谢谢大家

1 个答案:

答案 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);
}