Ваш оригинальный узор выглядит странным: большинство символов, написанных \x..
, находятся в таблице ASCII. Зачем использовать эту сложную нотацию, если вы можете написать (например) \n
за \x0A
, \r
за \x0D
и т. Д.? Это можно записать в более простой форме (всегда для PHP):
/^(?:\d{1,16}|(?:\n|\r|[ -Z]|_|[a-z]|\xC2\xA0|\xCE\xA9){1,11})$/i
(я удалил х модификаторов и незначащие пробелы модификатора сек было бесполезно..)
Так как шаблон (модификатор i), [a-z]
уже включен в [ -Z]
(который содержит [A-Z]
, см. таблицу ASCII) и может быть удален. Другое дело, используя класс символов вместо чередования отдельных символов короче и более производительное:
/^(?:\d{1,16}|(?:[\n\r -Z_]|\xC2\xA0|\xCE\xA9){1,11})$/i
О \xC2\xA0
и \xCE\xA9
: Эти последовательности обозначают символы NO-BREAK SPACE
и GREEK CAPITAL LETTER OMEGA
закодирована в UTF8.
PCRE (механизм регулярных выражений PHP) по умолчанию не поддерживает unicode и считывает строку как последовательность одиночных байтов (один байт на символ). Можно читать строки как строки с кодировкой UTF8, если вы добавляете модификатор u
, или если вы начинаете шаблон с (*UTF8)
. В вашем шаблоне нет модификатора u
, поэтому каждый байт рассматривается как символ.
Java regex engine поддерживает unicode по умолчанию и не читает строковый байт по байту, а символ по символу.
Чтобы сделать «перевод» с PHP на Java проще, я буду переписывать PHP шаблон с модификатором U:
/^(?:[0-9]{1,16}|[\n\r -Z_\x{00A0}\x{03A9}]{1,11})$/iu
\xC2\xA0
который описывает каждый байт теперь заменен \x{00A0}
где 00A0
является код Юникода точка для персонажа NO-BREAK SPACE
. То же самое для омеги. (обратите внимание на the unicode table)
Обратите внимание, что модификатор у расширяет \d
для всех цифр в таблице Unicode. Чтобы предотвратить этот побочный эффект, я заменил его на [0-9]
.
Чтобы написать шаблон Java, все, что вам нужно, чтобы заменить синтаксис \x{....}
с синтаксисом \u....
и использовать опцию CASE_INSENSITIVE:
^(?:[0-9]{1,16}|[\n\r -Z_\u00A0\u03A9]{1,11})$
(не забудьте, чтобы избежать обратной косой черты)
Большое спасибо! Я новичок в регулярных выражениях, а оригинальное регулярное выражение не мое, поэтому я ничего не могу сказать о его странности. Мне просто нужно преобразовать его в Java. Еще раз спасибо! –