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)(.+;)(.+;)", "");
所有这些都没有完全带来解决方案..
答案 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|$)", ""));