2009-11-19 15 views
3

У меня есть строка ввода, содержащая несколько строк (демаркация по \ n). Мне нужно найти шаблон в строках, и если он найден, замените всю строку пустой строкой.Заменить строку, содержащую Regex

Мой код выглядит так,

Pattern p = Pattern.compile("^.*@@.*$"); 
String regex = "This is the first line \n" + 
       "And this is second line\n" + 
       "Thus is @@{xyz} should not appear \n" + 
       "This is 3rd line and should come\n" + 
       "This will not appear @@{abc}\n" + 
       "But this will appear\n"; 
Matcher m = p.matcher(regex); 
System.out.println("Output: "+m.group()); 

Я ожидаю ответа как:

Output: This is the first line  
     And this is second line 
     This is 3rd line and should come 
     But this will appear. 

Я не могу получить его, пожалуйста, помогите, меня.

Спасибо,
Amit

ответ

2

Другие говорят о включении многострочного режима, но поскольку Java не по умолчанию DOTALL (режим с одной строкой), есть более простой способ ... просто оставьте^и $ off.

String result = regex.replaceAll(".*@@.*", ""); 

Обратите внимание, что проблема либо с той или с помощью:

"(?m)^.*@@.*$" 

... в том, что он оставит пустые строки в случае, если это требование не иметь их, то регулярное выражение будет. будь другим.

Полное регулярное выражение, которое не оставляет пустых строк:

String result = regex.replaceAll(".*@@.*(\r?\n|\r)?", ""); 
+2

Как указывает другой плакат, добавив \ n? до конца заменит, не оставив пустых строк ... хотя должен быть расширен до \ r? \ n? если вы считаете, что можете получить окончание строк в стиле DOS. – PSpeed

+0

Спасибо, PSpeed. Можете ли вы дать регулярное выражение, которое возвращает строку, не выходя из пустых строк. – Amit

+0

Добавлено полное регулярное выражение. – PSpeed

5

Для того, чтобы позволить ^ совпадать с началом строки и $ матча конец одного, то Вам необходимо включить опцию многострочный. Вы можете сделать это, добавив (?m) перед своим регулярным выражением следующим образом: "(?m)^.*@@.*$".

Кроме того, вы хотите сохранить группировку, пока ваше регулярное выражение находит совпадение, которое может быть сделано, как это:

while(m.find()) { 
    System.out.println("Output: "+m.group()); 
} 

Обратите внимание на регулярном выражении будет соответствовать этим строкам (а не те, которые вы не указаны иным):

Thus is @@{xyz} should not appear 
This will not appear @@{abc} 

Но если вы хотите заменить строки, которые содержат @@, как название вашего поста наводит на мысль, сделать это следующим образом:

public class Main { 
    public static void main(String[] args) { 
     String text = "This is the first line \n" + 
         "And this is second line\n" + 
         "Thus is @@{xyz} should not appear \n" + 
         "This is 3rd line and should come\n" + 
         "This will not appear @@{abc}\n" + 
         "But this will appear\n"; 
     System.out.println(text.replaceAll("(?m)^.*@@.*$(\r?\n|\r)?", "")); 
    } 
} 

Редактировать: учтено * nix, разрывы строк в Windows и Mac, как упоминалось в PSeed.

+0

Спасибо, Bart, Но есть ли способ получить строку без строк, соответствующих шаблону (мне это нужно.) – Amit

+2

Да, я показал, как это сделать в моей 'replaceAll (...)' пример. –

-1

Есть многострочный вариант в Java, проверьте документы. Есть один в C# по крайней мере, я думаю, что это должно быть проблемой.

-1

Посмотрите на JavaDoc на Matcher.matches() метод: метод

boolean java.util.regex.Matcher.matches() 
Attempts to match the entire input sequence against the pattern. 

If the match succeeds then more information can be obtained via the start, end, and group methods. 

Returns: 
true if, and only if, the entire input sequence matches this matcher's pattern 

Попробуйте вызова "матчи" первым , На самом деле это не приведет к замене текста, как указано в вашем сообщении, но оно поможет вам.

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