【问题标题】:Multiline regex java, or grammar? [duplicate]多行正则表达式 java,还是语法? [复制]
【发布时间】:2017-10-11 15:12:47
【问题描述】:

我在一个文件中包含 n 次以下模式:

ENUM CMF_QUOTE_EVENT
    CMF_QUOTE_EVENT_Activate            "Activate"
    CMF_QUOTE_EVENT_Suspend             "Suspend"
    CMF_QUOTE_EVENT_Delete              "Delete"
ENDENUM

我的目标是捕获枚举的所有值。基本上我需要关键字“ENUM”和“ENDENUM”之间的三行。

我尝试为此使用多行正则表达式,但我仍然无法捕捉到它。 这是我做的:

  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();

我想改用语法,但它看起来很重,仅用于此用途。我可以用正则表达式做这种事情吗?

谢谢大家

【问题讨论】:

  • 使用Pattern.DOTALL
  • 我不会为此使用正则表达式。只是我的意见。

标签: java regex java-8 grammar


【解决方案1】:

如果您检查 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);
} 

【讨论】:

  • 非常感谢它有效。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-05-08
  • 2011-08-04
  • 1970-01-01
相关资源
最近更新 更多