Как сгруппировать в регулярных выражениях - PullRequest
0 голосов
/ 24 августа 2009

У меня есть эта входная строка (oid): 1.2.3.4.5.66.77.88.99.10.52

Я хочу сгруппировать каждое число в 3, как это

Группа 1: 1.2.3

Группа 2: 4,5,66

Группа 3: 77,88,99

Группа 4: 10,52

Он должен быть очень динамичным в зависимости от входа. Если у него 30 чисел, это означает, что он вернет 10 групп.

Я проверял с помощью этого регулярного выражения: (\ d +. \ D +. \ D +)

Но в результате получается

Матч 1: 1.2.3

Subgroups:

1: 1.2.3

Матч 2: 4,5,66

Subgroups:

1: 4.5.66

Матч 3: 77,88,99

Subgroups:

1: 77.88.99

Где еще пропустили еще один матч.

Может кто-нибудь помочь мне предоставить Regex. Спасибо

Ответы [ 4 ]

1 голос
/ 24 августа 2009
\d+(?:\.\d+){0,2}

Это в основном то же самое, что и последнее регулярное выражение Ала - ((?:\d+\.){0,2}\d+) - но я думаю, что так будет понятнее. И нет необходимости ставить скобки вокруг всего регулярного выражения. Предполагая, что вы используете Matcher.find () для получения совпадений, вы можете использовать group() или group(0) вместо group(1) для получения сопоставленного текста.

1 голос
/ 24 августа 2009

Если вы хотите сопоставить до трех цифр, попробуйте:

((?:\d+\.?){1,3})

Часть {1,3} соответствует 1-3 предыдущего элемента (это одна или несколько цифр, за которыми следует литерал .. Обратите внимание, что точка экранирована, поэтому не соответствует ни одному символу.

Редактировать

Дальнейшее объяснение: (?: ) часть - это группировка, которая не может использоваться для обратных ссылок (как правило, быстрее), см. Раздел 4.3 здесь для получения дополнительной информации. Конечно, вы также можете просто использовать ((\d+\.?){1,3}), если хотите. Для получения дополнительной информации о {1,3} см. здесь в разделе «Ограничение повторения».

Редактировать (2)

Исправлена ​​ошибка, указанная dtmunir. Альтернативный способ, который немного более явный (и не улавливает лишние "." В конце ранних групп):

((?:\d+\.){0,2}\d+)
0 голосов
/ 24 августа 2009

Это мой странный код для этого без регулярного выражения: -)

public static String[] getTokens(String s) {

    String[] splitted = s.split("\\.");

    //Personally I hate Double.valueOf but I don't know how to avoid it
    String[] result = new String[Double.valueOf(Math.ceil(Double.valueOf(splitted.length) / 3)).intValue()];

    for (int i = 0, j = 0; j < splitted.length; i++, j+=3) {

        //Weird concat
        result[i] = splitted[j] + ( j+1 < splitted.length ? "." + splitted[j+1] : "" ) + ( j+2 < splitted.length ? "." + splitted[j+2] : "" );

    }
    return result;
}
0 голосов
/ 24 августа 2009

А1, который не захватит 52. Но этот на самом деле будет:

((?:.? \ Д + \) {1,3})

Единственное изменение - добавление знака вопроса после. Это позволяет ему принять последний номер без точки после него

Пояснение ( РЕДАКТИРОВАТЬ ):

\ d +, как вы можете себе представить, захватывает последовательные цифры.

. захватывает период

\.? захватывает период, но позволяет внутренней группе не требовать периода в конце

(?: \ D + \.?) Определяет "одну группу", которая в вашем случае должна быть 3 числа.

{1,3} устанавливает пределы. Требуется минимум 1 внутренняя группа и не более 3 внутренних групп. Эти группы могут заканчиваться или не заканчиваться точкой.

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