2个字符之间的Java正则表达式包括换行或制表符

时间:2018-07-04 03:35:22

标签: java regex matcher

我在2个字符串之间遇到了正则表达式问题。我想在字符串##之间获取值,但是当我换行时(在我的情况下,\r\n),此正则表达式不起作用。例如:

#89899#
#this is string I have
problem#

第2行有问题,因为有新行。如何在正则表达式中排除换行符?我的代码:

public static List parserStringBetween(String param1, String param2, String data) {
    List result = null;

    if (param1 != null && !"".equalsIgnoreCase(param1) && param2 != null && !"".equalsIgnoreCase(param2)
            && data != null && !"".equalsIgnoreCase(data)) {
        result = new ArrayList<>();
        Matcher m = Pattern.compile("\\" + param1 + "(.*?)\\" + param2).matcher(data);
        while (m.find()) {
            result.add(m.group(1));
        }

    }
    return result;
}

param1param2是设置之间的字符串,即此处的#。如何解决这个问题?

2 个答案:

答案 0 :(得分:2)

通过DOTALL添加(?s)标志:

Pattern.compile("\\Q" + param1 + "\\E(?s)(.*?)\\Q" + param2 + "\\E")

还请注意使用\Q...\E来正确转义定界符。只是在所有情况下都不能使用反斜杠。

答案 1 :(得分:1)

还要包括换行符和空格 ,请使用:

^#[\s\S]*#$

签出here in action

您的Java代码变为:

Matcher m = Pattern.compile("^" + param1 + "[\\s\\S]*" + param2 + "$").matcher(data);

您也可以使用Pattern.DOTALL模式。

Matcher m = Pattern.compile("\\" + param1 + "(.*?)\\" + param2, Pattern.DOTALL).matcher(data);