Регулярное выражение для многобайтовой строки - PullRequest
2 голосов
/ 29 марта 2012

Что может быть регулярным выражением для обнаружения многобайтовой строки.

Например, вот выражение для обнаружения строки на английском языке

Pattern p=Pattern.compile("[a-zA-Z/]");

Точно так же я хочу шаблон, который имеет несколько байтов, как

コ メ ン ト _1050_ 固 - 減 価 償 却 費

Ответы [ 5 ]

3 голосов
/ 29 марта 2012

Возможно, вы захотите взглянуть на Поддержка Unicode в Java

Я думаю, что в основном вам нужно свойство Unicode \p{L}. Это будет соответствовать любой кодовой точке, которая имеет свойство "буква".

Так что ваше регулярное выражение может выглядеть так

Pattern p=Pattern.compile("[\\p{L}/]");

Я только что заменил диапазоны символов a-zA-Z на \p{L}


Начиная с Java 7 вы также можете использовать Pattern.UNICODE_CHARACTER_CLASS

Включает версию предопределенных классов символов и классов символов POSIX в Unicode.

Это превратит предопределенный \w в версию Unicode, означает, что он будет соответствовать всем буквам и цифрам Unicode (и символам, соединяющим строки, например _)

Таким образом, чтобы соответствовать вашей строке コメント_1050_固-減価償却費, вы можете использовать

Pattern p=Pattern.compile("^\\w+$", Pattern.UNICODE_CHARACTER_CLASS);

Это будет соответствовать любой строке, состоящей из букв, цифр и _

Подробнее см.

и здесь регулярное выражение.info обзор сценариев, свойств и блоков Unicode.

Смотрите здесь известный ответ от tchrist о предостережениях регулярных выражений в Java, включая обновленное то, что изменилось с Java 7 (или будет в Java 8)

2 голосов
/ 29 марта 2012

Если вы хотите определить, есть ли у вас многобайтовые строки, вы не можете посмотреть длину

if (text.length() != text.getBytes(encoding).length)

Это обнаружит, что для любой кодировки использовался многобайтовый символ.

1 голос
/ 29 марта 2012

По сути, регулярные выражения Java работают со строками, а не массивами байтов - символы представлены в виде абстрактных «символьных» сущностей, а не байтов в некоторой конкретной кодировке.Это не совсем верно, поскольку тип char содержит только символы из базовой многоязычной плоскости и символы Юникода вне этого диапазона, представленные в виде двух значений char, но, тем не менее, «многобайтовый» является относительным и зависит от кодировки.

Если вам нужно «многобайтовое в UTF-8», то обратите внимание, что только символы со значениями 0-127 являются однобайтовыми в этой кодировке.Итак, самый простой способ проверить это использовать цикл и проверять каждый символ - если он больше 127, это больше, чем один байт в UTF-8.

Если вы настаиваете на использовании регулярного выражения, вы можетевероятно, используйте оператор диапазона символов в регулярном выражении следующим образом: [\u0080-\uFFFF] (не проверял, и \uFFFF на самом деле не символ, но я думаю, что механизм регулярных выражений должен его принять).

0 голосов
/ 29 марта 2012

Хорошее введение в регулярные выражения UniCode здесь .

0 голосов
/ 29 марта 2012

Вам нужно будет использовать Unicode для элементов, которые не на английском языке. Эта ссылка должна предоставить вам некоторую информацию.

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