2013-11-08 6 views
2

Я нашел код в Java Регулярное выражение который путает мне:Регулярное выражение в Java: Pattern.compile ("J. * \ d [0-35-9] - \ d \ d - \ d \ d")

Pattern.compile("J.*\\d[0-35-9]-\\d\\d-\\d\\d"); 

Строка для компиляции является:

String string1 = "Jane's Birthday is 05-12-75\n" + "Dave's Birthday is 11-04-68\n" + "John's Birthday is 04-28-73\n" + "Joe's Birthday is 12-17-77"; 

что это значит по

[0-35-9] 

И почему 4 "\ D" с вместо 3? Я предполагаю, что в день рождения всего 3 цифры.

ответ

2

Форма \\d просто совпадает с цифрой, а не число.

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

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

Давайте посмотрим на ваш матч и почему.

Joe's Birthday is 12-17-77 
       ^  match a digit 0 to 9 
       ^  match any character of '0' to '3', '5' to '9' 
        ^  match a '-' literally 
        ^  match a digit 0 to 9 
        ^ match a digit 0 to 9 
        ^ match a '-' literally 
         ^ match a digit 0 to 9 
         ^ match a digit 0 to 9 

[0-35-9] часть соответствует любому символу из 0 в 3, 5 к 9

все Ваше регулярное выражение объяснило:

J    'J' 
.*    any character except \n (0 or more times) 
\d    match a digit 0 to 9 
[0-35-9]  any character of: '0' to '3', '5' to '9' 
    -   match a '-' literally 
    \d   match a digit 0 to 9 
    \d   match a digit 0 to 9 
    -   match a '-' literally 
    \d   match a digit 0 to 9 
    \d   match a digit 0 to 9 
2

\\d не соответствует количеству, оно соответствует цифре. Различие заключается в том, что \\d\\d будет соответствовать двум последовательным цифрам.

[0-35-9] будет соответствовать цифре в диапазоне 0-3 или цифрой в диапазоне 5-9.

Практический результат состоит в том, что это соответствует дню рождения, где месяц 10, 11, 12, 01, 02, 03, 05, 06, 07, 08 или 09. День и год не имеют значения при условии, что они две цифры. Это очень длинный способ сказать: «Найди мне день рождения, которого не было в апреле (04)».

2

Что это значит по [0-35-9]:

Это означает, что вы предоставляете set of characters, заключенный в квадратные скобки. Он задает заданные символы, которые будут успешно соответствовать одному символу из заданной входной строки. Таким образом, указанный класс символов будет соответствовать, если совпадающий символ находится среди 0 по 3, или 5 по 9 включительно.

И почему существует 4 "\ d" s вместо 3? Я предполагаю, что в день рождения есть только 3 номеров.

Ваш день рождения часть строки является: Birthday is 05-12-75:

\d является predefined character class где \d представляет собой цифру, и \d\d представляет собой две последовательные цифры. Следовательно, для даты xx-xx-xx-xx мы бы написать, \\d\\d-\\d\\d-\\d\\d-\\d\\d, где x предполагается представлять цифру (0-9)

1

Путаница возникает в том, как мы воспринимаем число. К нашему математическому глазу видно, что средняя часть - это единственное число, число «35». Но на самом деле это два числа: «3» и «5». Как уже было подробно сказано ранее, это фактически два диапазона, диапазон цифр от 0 до 3 включительно и диапазон от 5 до 9 включительно, таким образом устраняя 4 из возможных цифр, которые он будет соответствовать.

Что касается числа «\ d» s, то на самом деле 5 нет 4. Первая пара с одной цифрой из диапазонов цифр в месяц (например, октябрь - 10, а июнь - 06 , так что оба совпадают, в то время как апрель, который равен 04, не соответствует). следующие две пары «\ d» до дня. Последние две пары составляют год.

Смежные вопросы