2014-09-16 2 views
1
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)(.+;)(.+;)", ""); 

которые все точно не принося решением ..

ответ

1

Используйте флаг многоканальный (?m), что делает ^ и $ матч на переводы строк, и флаг DOTALL (?s), что делает Точечная совпадение строк:

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

Начало однозначно - не-R символ, то .*?^ будет захватывать каждый обугливаются до начал следующей строки - включая символ новой строки полукокс Добавления альтернативного окончания \Z обслуживает последнюю строку также удаляется.

См. live demo, который включает в себя краевой корпус последнего удаления линии.

+0

Работает отлично! Благодаря!! – tonimaroni

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|$)", "")); 
+0

Спасибо за это. Он не соответствовал 100% при первой попытке - причина добавления новых строк в строку. Ответ Богемана. Спасибо вам обоим! – tonimaroni

+0

yep, тогда я обновил свой ответ 42 мин назад. –

Смежные вопросы