正则表达式可选匹配多行模式

时间:2013-11-30 00:42:04

标签: java regex

我正在试图弄清楚如何提出一个支持以下2个用例的正则表达式:

用例1:

-- File 1 (input) --
keepthis

junkhere:
this should be removed

用例2:

-- File 2 (input) --
keepthis

------------
junkhere:
this should be removed

基本上我正在构建一个正则表达式来删除“junkhere:”和“down”中的所有内容。但是,在用例2中,有一个可选的“------------”包含在“junkhere:”之前的行中,有时但不总是(不确定的确切)

输出应为:

-- File 3 (output) --
keepthis

我有以下正则表达式,它适用于用例1但不适用于用例2:

Pattern JUNKHERE_REGEX = Pattern.compile("^(((-+)(.*))?junkhere:(.*))$", Pattern.MULTILINE | Pattern.DOTALL);

    Matcher m = JUNKHERE_REGEX.matcher(<input from either file1 or file2>);
    if (m.find()) || (n.find() || (o.find()) { // there could be other matchers here n and o in this case so I would like to keep the replaceall code below the same so I don't have to create a new if statement 
      text = m.replaceAll("");  
      text = text.replaceAll("[\n]+$", ""); // replace and delete any newlines
    }
    System.out.println(text); // should echo "keepthis" 

我对正则表达式不太好但是我需要做什么才能使用例2(和用例1)?

谢谢!

1 个答案:

答案 0 :(得分:1)

[\n\r]+(?:[-]+[\n\r]+)?\s*junkhere:\s*[\n\r][\s\S]*的匹配替换为空字符串。

Regular expression visualization


在此处测试:http://regexr.com?37edu和此处:http://regexr.com?37ee1


在Java中,你必须加倍转义字符:

= text.replaceAll("[\\n\\r]+(?:[-]+[\\n\\r]+)?\\s*junkhere:\\s*[\\n\\r][\\s\\S]*", "");