RegEx в Java: как работать с новой строкой

В настоящее время я пытаюсь научиться использовать регулярные выражения, поэтому ответьте, пожалуйста, на мой простой вопрос. Например, у меня есть входной файл, содержащий кучу ссылок, разделенных новой строкой:

www.foo.com/Archives/monkeys.htm как работать с новой строкой В настоящее время я пытаюсь научиться использовать регулярные выражения, поэтому ответьте, пожалуйста, на мой простой вопрос. Например, у меня есть входной файл, содержащий кучу ссылок, разделенных новой строкой: www ....

В настоящее время я пытаюсь научиться использовать регулярные выражения, поэтому ответьте, пожалуйста, на мой простой вопрос. Например, у меня есть входной файл, содержащий кучу ссылок, разделенных новой строкой:

www.foo.com/Archives/monkeys.htm как работать с новой строкой В настоящее время я пытаюсь научиться использовать регулярные выражения, поэтому ответьте, пожалуйста, на мой простой вопрос. Например, у меня есть входной файл, содержащий кучу ссылок, разделенных новой строкой: www ....

В настоящее время я пытаюсь научиться использовать регулярные выражения, поэтому ответьте, пожалуйста, на мой простой вопрос. Например, у меня есть входной файл, содержащий кучу ссылок, разделенных новой строкой:

www.foo.com/Archives/monkeys.htm
Описание веб-сайта Monkey.

www.foo.com/Archives/pigs.txt
Описание веб-сайта Pig.

www.foo.com/Archives/kitty.txt
Описание веб-сайта Китти.

www.foo.com/Archives/apple.htm
Описание веб-сайта Apple.

Если бы я хотел получить один веб-сайт вместе с его описанием, это регулярное выражение, похоже, работает в инструменте тестирования: . * Www. * \\ s. * Pig. *

Однако, когда я пытаюсь запустить его в своем коде, это не работает. Это выражение правильное? Я попытался заменить "\ s" на "\ n", но, похоже, это все еще не работает.

26
задан Cœur 17 December 2017 в 08:54
поделиться

4 ответа

Строки, вероятно, разделены \ r \ n в вашем файле. И \ r (возврат каретки), и \ n (перевод строки) считаются символами-разделителями строк в регулярных выражениях Java, а также . метасимвол не соответствует ни одному из них. \ s будет соответствовать этим символам, поэтому он потребляет \ r , но при этом остается . * , чтобы соответствовать \ n , что терпит неудачу. Ваш тестировщик, вероятно, использовал только \ n для разделения строк, которые потреблялись \ s .

Если я прав, изменение \ s на \ s + или [\ r \ n] + должно заставить его работать. Вероятно, это все, что вам нужно сделать в этом случае, но иногда вам нужно сопоставить ровно один разделитель строк или, по крайней мере, отслеживать, сколько вы сопоставляете. В этом случае вам понадобится регулярное выражение, которое точно соответствует одному из трех наиболее распространенных типов разделителей строк: \ r \ n (Windows / DOS), \ n (Unix / Linus / OSX) и \ r (старые Mac). Подойдет любой из них:

\r\n|[\r\n]

\r\n|\n|\r

Обновление: Начиная с Java 8, у нас есть еще один вариант, \ R . Он соответствует любому разделителю строк, включая не только \ r \ n , но и несколько других, определенных стандартом Unicode . Это эквивалентно следующему:

\r\n|[\n\x0B\x0C\r\u0085\u2028\u2029]

Вот как его можно использовать:

(?im)^.*www.*\R.*Pig.*$

Параметр i делает регистр нечувствительным, а m переводит его в многострочный режим, позволяя ^ и $ для сопоставления на границах строк.

56
ответ дан 28 November 2019 в 06:28
поделиться

Работает для меня:

import java.util.regex.Pattern;
import java.util.regex.Matcher;
public class Foo {
  public static void main(String args[]) {
    Pattern p = Pattern.compile(".*www.*\\s.*Pig.*");
    String s = "www.foo.com/Archives/monkeys.htm\n"
             + "Description of Monkey's website.\n"
             + "\n"
             + "www.foo.com/Archives/pigs.txt\n"
             + "Description of Pig's website.\n"
             + "\n"
             + "www.foo.com/Archives/kitty.txt\n"
             + "Description of Kitty's website.\n"
             + "\n"
             + "www.foo.com/Archives/apple.htm\n"
             + "Description of Apple's website.\n";
    Matcher m = p.matcher(s);
    if (m.find()) {
      System.out.println(m.group());
    } else {
      System.out.println("ERR: no match");
    }
  }
}

Возможно, проблема была в том, как вы использовали объекты Pattern и Matcher?

1
ответ дан 28 November 2019 в 06:28
поделиться

попробуйте это

([^\r]+\r[^\r])+
1
ответ дан 28 November 2019 в 06:28
поделиться

Эта версия соответствует новым строкам, которые могут быть либо Windows (\r\n), либо Unix (\n)

Pattern p = Pattern.compile("(www.*)((\r\n)|(\n))(.*Pig.*)");
String s = "www.foo.com/Archives/monkeys.htm\n"
           + "Description of Monkey's website.\n"
           + "\r\n"
           + "www.foo.com/Archives/pigs.txt\r\n"
           + "Description of Pig's website.\n"
           + "\n"
           + "www.foo.com/Archives/kitty.txt\n"
           + "Description of Kitty's website.\n"
           + "\n"
           + "www.foo.com/Archives/apple.htm\n"
           + "Description of Apple's website.\n";
Matcher m = p.matcher(s);
if (m.find()) {
  System.out.println("found: "+m.group());
  System.out.println("website: "+m.group(1));
  System.out.println("description: "+m.group(5));
}
System.out.println("done");
0
ответ дан 28 November 2019 в 06:28
поделиться
Другие вопросы по тегам:

Похожие вопросы: