Совпадение "81" в "630.81.11" с использованием регулярных выражений - PullRequest
1 голос
/ 04 июня 2010

Я хочу соответствовать «81» в «630.81.11». Я застрял с \.[0-9]*\., который включает в себя точки.

Ответы [ 4 ]

10 голосов
/ 04 июня 2010
/^[0-9]+\.([0-9]+)\.[0-9]+$/
6 голосов
/ 04 июня 2010

Обновление: После просмотра проблемы, которую вы пытаетесь решить, я бы предложил не использовать регулярные выражения.

Используется в запросе PostGreSQL. Мне нужно отсортировать по трем частям. Что-то вроде:

ORDER BY
    substring(plannr from '^[0-9]*')::integer,
    substring(plannr from '\.[0-9][0-9]\.')::interger,
    substring(plannr from '[0-9]*$')::integer

Вместо регулярного выражения вы можете использовать, например, split_part:

SELECT plannr
FROM table1
ORDER BY
    split_part(plannr, '.', 1)::integer,
    split_part(plannr, '.', 2)::integer,
    split_part(plannr, '.', 3)::integer;

Результат:

"2.2.3"
"2.10.3"
"2.10.20"
"10.1.4"
"630.81.11"

Данные испытаний:

CREATE TABLE table1 (plannr VARCHAR(100) NOT NULL);
INSERT INTO table1 (plannr) VALUES
('630.81.11'),
('2.2.3'),
('2.10.3'),
('2.10.20'),
('10.1.4');

Оригинальный ответ: Если ваш движок регулярных выражений включает в себя заглядывания фиксированной длины и заглядывания назад, вы можете сделать следующее:

(?<=\.)[0-9]+(?=\.)
2 голосов
/ 04 июня 2010

Вы можете заключить интересную часть в группу, а затем извлечь ее. Итак, что-то вроде "\. ([0-9] *) \."; Парены обозначают группу.

1 голос
/ 04 июня 2010
Pattern pat = Pattern.compile("\\.(\\d+)\\.");
String str = "630.81.11";
Matcher matcher = pat.matcher(str);

while (matcher.find())
{
    System.out.println(matcher.group(1));
}

Я проверял это на Java. Вывод выглядит следующим образом:

81

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