第1组不匹配每个正则表达式

时间:2013-12-04 05:30:46

标签: java regex

我想要以下内容:

- 输入 -

keep this

      keep this too
  ------ Remove Below ------
  remove all of this

成为:

- 输出 -

keep this

      keep this too

但是,我无法弄清楚如何匹配所有内容,直到“------删除以下------”,这样我就可以分组并移除除上述预期输出之外的所有内容。

    String text = "keep this\n       \n"
            + "      keep this too\n  ------ Remove Below ------\n  remove all of this\n";
    Pattern PATTERN = Pattern.compile("^(.*)(-+)(.*)Remove Below(.*)(-+)(.*)$",
            Pattern.MULTILINE | Pattern.DOTALL);
    Matcher m = PATTERN.matcher(text);
    if (m.find()) {
        int count = m.groupCount();
        String g0 = m.group(0);
        String g1 = m.group(1);  // contains "keep this\n    \n    keep this too\n -----"
        String g2 = m.group(2);
        //
        // How can I group correctly to arrive at above expected -- Output --??
        //
    }

3 个答案:

答案 0 :(得分:2)

制作正则表达式non-greedy

Pattern PATTERN = Pattern.compile("^(.*?)(-+)(.*?)Remove Below(.*?)(-+)(.*)$", 
                                  Pattern.DOTALL);

在您的情况下也不需要Pattern.MULTILINE

现在m.group(1)会给你:

keep this\n       \n      keep this too\n

答案 1 :(得分:1)

"^(.*?)(-+)(.*)Remove Below(.*)(-+)(.*)$" 

也会这样做。

答案 2 :(得分:0)

您可以使用检查“------ Remove Below ------”的索引,然后在该索引或之前取出子串 将字符串拆分为字符串数组,每行作为一个数组项

String[] split = s.split("\n");

循环遍历此数组并构造一个字符串,直到该项匹配------ Remove Below ------

String result="";
        for(int i=0;i<str.length;i++){
            if(!str[i].contains(" Remove Below ")){
                result = result.concat(str[i]);
            }else{
                break;
            }
        }