pattern.dotall在\ Q和\ E之间不起作用

时间:2016-02-15 09:58:34

标签: java regex

我想写一个正则表达式来从输入行获取名称和城市。

示例:

大卫嗨!你好吗?你现在在钦奈吗?

我需要从这段文字中取出大卫和钦奈

我写了下面的代码它工作正常,但是当这行中有换行符时它无法正常工作

package com.test;

import java.util.regex.Matcher;
import java.util.regex.Pattern;

public class Testing {

    public static void main(String[] args) {

        String input = "Passage : Hi David! how are you? are you in chennai now? "
                + "\n Hi Ram! how are you?\n are you in chennai now?";
        String regex1="\\QHi \\E(.*?)\\Q! how are you? are you in \\E(.*?)\\Q now?\\E";
        Pattern p = Pattern.compile(regex1,Pattern.DOTALL);
        Matcher m = p.matcher(input);

        StringBuffer result = new StringBuffer();
        while (m.find()) {
            m.appendReplacement(result,m.group(1)+" is fine and yes I am in "+m.group(2));
        }
         m.appendTail(result);
        System.out.println(result);
    }

}

输出:

段落:大卫很好,是的,我在钦奈  嗨拉姆!你好吗?  你现在在钦奈吗?

预期产出

段落:大卫很好,是的,我在钦奈拉姆很好,是的,我在钦奈

注意:我也使用过Pattern.DOTALL。

提前致谢!!!

1 个答案:

答案 0 :(得分:2)

如果你的输入可以包含双空格,或换行/回车而不是常规空格,你应该使用\s 空白速记字符类,这也意味着你*可以在你的模式中依靠\Q...\E那么多。

我建议改用正则表达式:

String regex1="Hi\\s+(.*?)\\s+how\\s+are\\s+you\\?\\s+are\\s+you\\s+in\\s+(.*?)\\s+now\\?";

请参阅regex demo

输出:

Passage : David! is fine and yes I am in chennai 
 Ram! is fine and yes I am in chennai