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)(.+;)(.+;)", "");


所有这些都不能完全带来解决方案。

最佳答案

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

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


开始很简单-一个非R字符,然后
.*?^会抓取直到下一行开头的所有字符-包括换行符char添加\Z的替代结尾也要适应最后被删除的行。

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

10-07 19:06