【问题标题】:Java regex between 2 characters include new line or tab2 个字符之间的 Java 正则表达式包括换行符或制表符
【发布时间】:2018-07-04 03:35:21
【问题描述】:

我对 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 是设置之间的字符串,即这里的 #。如何解决这个问题?

【问题讨论】:

标签: java regex matcher


【解决方案1】:

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

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

还要注意使用\Q...\E 来正确转义分隔符。只是在它之前加一个反斜杠并不适用于所有情况。

【讨论】:

    【解决方案2】:

    要同时包含换行符和空格,请使用:

    ^#[\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);
    

    【讨论】:

    • 我的正则表达式在没有换行的情况下工作,但字符串有时在字符串中有 \r\n 并且正则表达式不起作用,因为包含 \r\n.. 任何解决方案?你的正则表达式不起作用..
    • @bob 所以你想在输出中包含带有\r\n 的字符串?
    • @bob 你只需要在 Pattern.compile($regex,[your_option]) 中打开 DOTALL 选项即可
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-11-24
    • 1970-01-01
    • 2019-07-02
    • 2012-01-08
    • 1970-01-01
    • 2016-09-20
    相关资源
    最近更新 更多