Замените строку, содержащую регулярное выражение - PullRequest
4 голосов
/ 19 ноября 2009

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

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

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

Ответы [ 4 ]

5 голосов
/ 19 ноября 2009

Чтобы позволить ^ соответствовать началу строки, а $ соответствовать концу строки, вам необходимо включить многострочную опцию. Вы можете сделать это, добавив (?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.

3 голосов
/ 19 ноября 2009

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

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

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

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

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

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

String result = regex.replaceAll( ".*@@.*(\r?\n|\r)?", "" );
0 голосов
/ 19 ноября 2009

Посмотрите на 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

Попробуйте сначала вызвать метод "совпадения". Это на самом деле не сделает замену текста, как отмечено в вашем посте, но продвинет вас дальше.

0 голосов
/ 19 ноября 2009

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...