否定正则表达式以排除完整的行

时间:2014-09-16 07:44:07

标签: java regex

ER430;000000000;
ADR03;000000020;
RID01;000000000;
RID02;000000000;

我在包含新行的字符串中有上述内容。现在我想剪断字符串 所以只留下带有前导“R”的行。结果应该是:

RID01;000000000;
RID02;000000000;

不幸的是,经过几个小时的尝试后我还没有找到解决方案..谢谢 任何帮助!!

我的一些测试:

 content = s.replaceAll("[^R].+;{1}.+;{1}", "");
 content = s.replaceAll("(?!R).*;{1}.*;{1}", "");
 content = s.replaceAll("(?!R)(.+;)(.+;)", "");

所有这些都没有完全带来解决方案..

2 个答案:

答案 0 :(得分:1)

使用多行标记(?m),使^$在换行符匹配,使用DOTALL标记(?s),使点匹配换行符:

str = str.replaceAll("(?sm)^[^R].*?(^|\\Z)", "");

开始很简单 - 非R字符,然后 .*?^将抓取下一行 start 的每个字符 - 包括换行符char添加\Z的备用结尾也适用于最后一行被删除。

请参阅live demo,其中包括最后一行删除的边缘情况。

答案 1 :(得分:0)

如果您在代码中使用锚点^$,则需要包含多行(?m)修饰符或DOTALL (?s)修饰符。

String str = "ER430;000000000;\n" + 
        "ADR03;000000020;\n" + 
        "RID01;000000000;\n" + 
        "RID02;000000000;";
System.out.println(str.replaceAll("(?s)(?<=\n|^)[^R][^;\n]*?;[^;\n]*;(\n|$)", ""));

输出:

RID01;000000000;
RID02;000000000;

System.out.println(str.replaceAll("(?m)(?<=\n|^)[^R][^;\n]*?;[^;\n]*;(\n|$)", ""));