匹配字符串的结尾但不是换行符?

时间:2012-05-09 18:21:15

标签: java regex

在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

2 个答案:

答案 0 :(得分:1)

是的,有。例如,(?-m)}$将匹配Java源文件末尾的闭括号。重点是禁用多线模式。您可以按我显示的方式禁用,也可以在Pattern实例上设置相应的标记。

更新:我相信当你实例化一个Pattern时,默认情况下多线是关闭的,但是在正则表达式的Eclipse中找到了。

答案 1 :(得分: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]
相关问题