2015-12-17 2 views
-1


Мне нужно преобразовать следующий PHP регулярное выражение:Преобразование PHP регулярное выражение для Java один

/^ (?: \d{1,16} | (?: \x0A | \x0D | [\x20-\x5A] | \x5F | [\x61-\x7A] | \xC2\xA0 | \xCE\xA9){1,11}) $/xsi 

Я новичок с регулярным выражением, и я нашел полезную ссылку:
http://www.regexplanet.com/advanced/java/index.html

ли я понимаю правильно , что я должен вставить только PHP регулярное выражение, нажмите кнопку «Тест» и этот результат:

'/^ (?: \\d{1,16} | (?: \\x0A | \\x0D | [\\x20-\\x5A] | \\x5F | [\\x61-\\x7A] | \\xC2\\xA0 | \\xCE\\xA9){1,11}) $/xsi' 

woul d работать в Java?

ответ

3

Ваш оригинальный узор выглядит странным: большинство символов, написанных \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})$ 

(не забудьте, чтобы избежать обратной косой черты)

+0

Большое спасибо! Я новичок в регулярных выражениях, а оригинальное регулярное выражение не мое, поэтому я ничего не могу сказать о его странности. Мне просто нужно преобразовать его в Java. Еще раз спасибо! –

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