Нечетная проблема с регулярным выражением Java - PullRequest
2 голосов
/ 24 февраля 2011

Я пытался ответить на вопрос о регулярном выражении для кого-то, и я наткнулся на то, что заставило меня почесать голову.Давая следующий код ...

public static void main(String[] args) throws IOException {
        String test = "Hello, how are you today?";
        Pattern p = Pattern.compile("(\\W)+");
        String[] words = p.split(test);
        System.out.println("--" + words[0] + "--");
        System.out.println("--" + words[1] + "--");
    }

Я получаю ожидаемые результаты

--Hello--
--how--

Однако, когда я использую ...

public static void main(String[] args) throws IOException {
        String test = "Hello, how are you today?";
        Pattern p = Pattern.compile("(\\W)*");
        String[] words = p.split(test);
        System.out.println("--" + words[0] + "--");
        System.out.println("--" + words[1] + "--");
    }

, я получаюрезультаты

----
--H--

Есть ли причина *, которая не работает точно так же, как + в этой ситуации?

Ответы [ 3 ]

4 голосов
/ 24 февраля 2011

Поскольку + означает один или более вхождений предыдущего совпадения, тогда как * означает ноль или более вхождений.

4 голосов
/ 24 февраля 2011

* соответствует нулю или более.В результате все становится разделителем (разделителями нулевой ширины)

Edit

Кстати, это не значит, что он действует не жадно.Если вы посмотрите на возвращенные символы, вы получите следующее:

[, H, e, l, l, o, , h, o, w, , a, r, e, , y, o, u, , t, o, d, a, y]

Обратите внимание, что между «o» и «h» нет двух пустых элементов;только один.Ниже каждый разделитель окружен {}.

{}H{}e{}l{}l{}o{, }{}h{}o{}w{ }{}a{}r{}e{ }{}y{}o{}u{ }{}t{}o{}d{}a{}y{?}
1 голос
/ 24 февраля 2011

Звезда Клини допускает повторения 0 или более любого конкретного элемента, поэтому, если вы распечатаете весь список (вместо просто 0 и 1), вероятно, это будет каждый символ слова в строке. Использование + гарантирует как минимум одно слово. (+ переводится как ww *).

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