Java正则表达式 - 多行

时间:2014-02-28 08:50:39

标签: java regex

我有一个带字符串的大数组。我需要使用数组中的字符串来形成模式。但是,对于文本中的字符串可能跨越几行。构造的模式不适用于多行标志。谁能指出出了什么问题?谢谢。

这是我的代码:

String[] phrases = new String[2];
    phrases[0] = "student (male)";
    phrases[1] = "worker (female)";

    Pattern[] ptn = new Pattern[phrases.length];

    int i = 0;
    for (String p : phrases)
    {
        p = Pattern.quote(p);
        System.out.println(p);
        ptn[i] = Pattern.compile(p+"\\:\\s\\w+",Pattern.MULTILINE);
        i++;
    }

    String text = "student\n(male): John";
    System.out.println(text);

    for(Pattern p : ptn)
    {
        Matcher m = p.matcher(text);
        while(m.find())
        {
            System.out.println(m.group());
        }
    }

1 个答案:

答案 0 :(得分:2)

在这里,您不需要MULTILINE标志:

正如@fge之前解释的那样,该标志仅表示^(和$)将匹配开始(以及结束)测试字符串中的每个行。
提醒:默认行为(没有该标志)会导致^$分别匹配整个字符串的开头和结尾


如果您想在某个时候匹配空格新行,我建议您尝试匹配\s

但是,如果您替换以下行:

phrases[0] = "student (male)";
phrases[1] = "worker (female)";

由:

phrases[0] = "student\\s(male)";
phrases[1] = "worker\\s(female)";

然后,您将无法使用Pattern#quote 转义括号。我相信最简单的方法是直接逃避它们,如下所示:

phrases[0] = "student\\s\\(male\\)";
phrases[1] = "worker\\s\\(female\\)";

如果您实际上无法修改这些字符串,则可以更改:

p = Pattern.quote(p);

有:

p = p.replaceAll("(\\(|\\))", "\\\\"+"$1").replaceAll(" ", "\\\\s");

这将:

  • 转义()
  • 替换空格(\s)以匹配空格或新行。

以下是Ideone link代码可能的一些可执行示例:)

希望它有所帮助!