В настоящее время я пытаюсь научиться использовать регулярные выражения, поэтому ответьте, пожалуйста, на мой простой вопрос. Например, у меня есть входной файл, содержащий кучу ссылок, разделенных новой строкой:
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", но, похоже, это все еще не работает.
Строки, вероятно, разделены \ 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
переводит его в многострочный режим, позволяя ^
и $
для сопоставления на границах строк.
Работает для меня:
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?
Эта версия соответствует новым строкам, которые могут быть либо 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");