Возможный вопрос о регулярном выражении - PullRequest
1 голос
/ 24 июня 2011

У меня есть простая программа, которая просматривает детали вашего IP-адреса, и я покажу вам пример моего кода

int regIndex = src.indexOf("Region:") + 16;
int endIndex = src.indexOf("<", regIndex);
String region = src.substring(regIndex, endIndex);
if(regIndex == 15) region = "None";
int counIndex = src.indexOf("Country:") + 17;
int couneIndex = src.indexOf(" <", counIndex);
String country = src.substring(counIndex, couneIndex);

Как видите, это определенно неСамый эффективный способ сделать это.Веб-сайт, который я использую, дает такую ​​информацию: http://whatismyipaddress.com/ip/1.1.1.1

Я никогда раньше не использовал Регулярные выражения, но мне кажется, что может быть такой, который действительно сделает это более эффективным и простым в программировании., но я искал вокруг, и я довольно потерян.

Итак, в основном мой вопрос заключается в том, как я могу использовать для этого Регулярное выражение (или, если есть другой, более эффективный способ).

Любая помощь будет отличной, Спасибо :))

Ответы [ 3 ]

1 голос
/ 24 июня 2011

Вы можете сделать что-то вроде этого:

String s = "bla Country: Australia <bla";

Pattern pattern = Pattern.compile("Country: (.*) [<]");
Matcher matcher = pattern.matcher(s);
if(matcher.find()) {
    System.out.println("Country = " + matcher.group(1));
}
0 голосов
/ 24 июня 2011

Во-первых, есть несколько онлайн-сайтов, которые могут помочь вам разработать регулярное выражение.Они позволяют вам ввести некоторый текст и регулярное выражение, а затем показать вам результат применения выражения к тексту.Это избавляет вас от необходимости писать код при разработке выражения и расширении вашего понимания.Хороший сайт, которым я пользуюсь, это FileFormat regex , потому что он позволяет мне проверять одно выражение на нескольких тестовых строках.Быстрый поиск также вызвал regex Planet , RegExr и RegexPal .Есть много других.

С точки зрения ресурсов, справочник по классу Java Pattern 1012 * полезен для разработки на Java, и мне очень нравится регулярное выражение.info ..

Для вашей проблемы я использовал fileFormat.info и придумал это регулярное выражение для соответствия "http://whatismyipaddress.com/ip/1.1.1.1":

.*//([.\w]+)/.*/(\d+(?:.\d+){3})

или в виде строки Java:

".*//([.\\w]+)/.*/(\\d+(?:.\\d+){3})"

Быстрыйbreak down говорит о чем-либо (.*), за которыми следуют две косые черты (//), за которыми следуют хотя бы одна или несколько десятичных точек или символов (([.\w]+)), за которыми следует косая черта, любое количество символов и еще одна косая черта (/.*/), за которым следует не менее 1 цифры ((\d+), за которой следуют 3 набора десятичной точки и хотя бы одна цифра ((?:.\d+){3})). Наборы скобок вокруг части имени сервера и части IPвызванные группы захвата, и вы можете использовать методы класса Java Matcher для возврата содержимого этих разделов. ?: во второй части ip-адреса говорит о том, что мы используем скобки для группировки символов, но это не тактррассматривается как группа захвата.

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

Все это можно изучить по вышеуказанным ссылкам.

0 голосов
/ 24 июня 2011

Источник будет выглядеть так

<tr><th>Country:</th><td>Australia <img src="http://whatismyipaddress.com/images/flags/au.png" alt="au flag"> </td></tr>

Использование регулярных выражений означает совпадение с шаблоном.

Шаблон, который указывает на ваши требуемые данные, довольно прост Country:. Вам также необходимо сопоставить следующие теги, такие как <\/th><td>. Единственное, что вам нужно, чтобы избежать косой черты. Затем есть данные, которые вы ищете, я бы советовал сопоставить все, что не является <, поэтому [^<], это группа захвата с отрицанием в начале, то есть любой символ, который не является <, чтобы повторить это, добавьте + в конце, что означает по крайней мере один из предшествующих символов.

Итак, все должно выглядеть так:

Country:<\/th><td>\s*([^<]+)\s*<

Я добавил здесь также скобки, они означают, что найденный шаблон помещается в переменную, так что ваш результат можно найти в группе захвата 1. Я добавил также \s*, этот символ пробела повторяется 0 или более раз, это должен соответствовать пробелу до или после ваших данных, я предполагаю, что вам это не нужно.

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