0

在 java 中,是否可以使用 Pattern.DOTALL 选项并搜索带有 \n 的行来创建一个匹配字符串结尾而不是换行符的正则表达式?

例子:

1)

aaa\n==test==\naaa\nbbb\naaa

2)

bbb\naaa==toast==cccdd\nb\nc

3)

aaa\n==trick==\naaaDDDaaa\nbbb

我要匹配

\naaa\nbbb\naaa

cccdd\nb\nc

但是,在第三个示例中,我不想在 DDD 上匹配文本。

\naaa
4

2 回答 2

1

就在这里。例如,(?-m)}$将匹配 Java 源文件末尾的右大括号。关键是禁用多行模式。您可以按照我的说明禁用,也可以通过在Pattern实例上设置适当的标志来禁用。

更新:我相信当你实例化 a 时 multiline 默认是关闭的Pattern,但在 Eclipse 的正则表达式查找中它是打开的。

于 2012-05-09T18:23:58.640 回答
0

您需要的正则表达式是:

"(?s)==(?!.*?==)([^(?:DDD)]*)"

这是完整的代码:

String[] sarr = {"aaa\n==test==\naaa\nbbb\naaa", "bbb\naaa==toast==cccdd\nb\nc", 
                 "aaa\n==trick==\naaaDDDaaa\nbbb"};

Pattern pt = Pattern.compile("(?s)==(?!.*?==)([^(?:DDD)]*)");

for (String s : sarr) {
    Matcher m = pt.matcher(s);
    System.out.print("For input: [" + s + "] => ");
    if (m.find())
        System.out.println("Matched: [" + m.group(1) + ']');
    else
        System.out.println("Didn't Match");
}

输出:

For input: [aaa\n==test==\naaa\nbbb\naaa] => Matched: [\naaa\nbbb\naaa]
For input: [bbb\naaa==toast==cccdd\nb\nc] => Matched: [cccdd\nb\nc]
For input: [aaa\n==trick==\naaaDDDaaa\nbbb] => Matched: [\naaa]
于 2012-05-09T20:12:09.870 回答