Разница между этими двумя регулярными выражениями?

В чем разница между этими двумя регулярными выражениями? (используя php preg_match())

/^[0-9\x{06F0}-\x{06F9}]{1,}$/u

/^[0-9\x{06F0}-\x{06F9}\x]{1,}$/u

Что означают последние \x во втором шаблоне?


person user16948    schedule 06.05.2012    source источник


Ответы (5)


Он интерпретируется как \x00 (нулевой символ), но почти наверняка это ошибка, вызванная неаккуратным редактированием или копированием и вставкой.

person hobbs    schedule 06.05.2012

http://www.regular-expressions.info/unicode.html

... Поскольку \x сам по себе не является допустимым токеном регулярного выражения...

person hpekristiansen    schedule 06.05.2012

Я думаю, что второй образец недействителен.

Согласно этой странице http://www.regular-expressions.info/unicode.html , \x полезен только после номера юникода:

Поскольку \x сам по себе не является допустимым токеном регулярного выражения, \x{1234} никогда нельзя спутать с совпадением \x 1234 раза.

person tomraithel    schedule 06.05.2012

Это странно. Обозначение Php для символа Юникода — \x{}. В перле то же самое.

Но у php есть модификатор //u в регулярных выражениях. Я предполагаю, что это означает юникод. В perl такого модификатора нет.

В регулярном выражении perl анализируется \x##, где ## требуется для обозначения символа ascii. Если это \x или \x#, предупреждение о недопустимой шестнадцатеричной цифре игнорируется (поскольку требуется 2 цифры, не больше и не меньше) и принимает только допустимые шестнадцатеричные цифры в последовательности. Если у вас нет цифр, как в \x, он использует \0 ascii char и т.д..

Однако любое обозначение \x{} допустимо, а \x{0} эквивалентно \x{}. И \x{0}-\x{ff} считается ascii, \x{100}- считается юникодом.

Таким образом, \x является допустимой escape-последовательностью hex/unicode, но сама по себе является предполагаемой шестнадцатеричной и является неполной, и, вероятно, это не то, что следует оставлять для механизмов синтаксического анализа по умолчанию.

person Community    schedule 06.05.2012
comment
@hobbs - Спасибо за предупреждение. В моей версии 5.10 есть /imsxpgc, в новой версии 5.14 /adlu — /imsxadlupgc. В старой версии переход на правила Unicode мог быть автоматическим в зависимости от целевой или шаблонной кодировки UTF-8 или платформы. Таким образом, /\x{100}/u кажется избыточным, за исключением того, что (?u: ) возможно. Что сейчас происходит с автоматическим продвижением с обеих сторон, я не знаю. В 5.10 есть ошибки, которые были исправлены, так что, возможно, я обновлюсь. - person ; 09.05.2012

Насколько я могу судить, второй \x на самом деле является недопустимым символом. Оба выражения работают?

person dpk2442    schedule 06.05.2012