Примечание! Работает только для 16-битных кодовых точек. Этот ответ неполон.
Краткий ответ
Класс символов для всех арабских цифр и латинских букв : [0-9A-Za-z\u00c0-\u00d6\u00d8-\u00f6\u00f8-\u02af\u1d00-\u1d25\u1d62-\u1d65\u1d6b-\u1d77\u1d79-\u1d9a\u1e00-\u1eff\u2090-\u2094\u2184-\u2184\u2488-\u2490\u271d-\u271d\u2c60-\u2c7c\u2c7e-\u2c7f\ua722-\ua76f\ua771-\ua787\ua78b-\ua78c\ua7fb-\ua7ff\ufb00-\ufb06]
.
Чтобы получить регулярное выражение, используйте /^
и добавьте +$/
. Это будет соответствовать строки, состоящие только из латинских букв и цифр, таких как "mérito"
или "Schönheit"
.
Чтобы сопоставить нецифровые или небуквенные символы для их удаления, введите ^
в качестве первого символа после открывающей скобки [
, добавьте /
и добавьте +/
.
Как я узнал об этом? Продолжить чтение.
Длинный ответ: используйте метапрограммирование!
Поскольку Javascript не имеет регулярных выражений Unicode, я написал программу на Python для перебора всего Unicode и фильтрации по имени Unicode. Трудно сделать это правильно вручную. Почему бы не позволить компьютеру выполнять грязную и черную работу?
import unicodedata
import re
import sys
def unicodeNameMatch(pattern, codepoint):
try:
return re.match(pattern, unicodedata.name(unichr(codepoint)), re.I)
except ValueError:
return None
def regexChr(codepoint):
return chr(codepoint) if 32 <= codepoint < 127 else "\\u%04x" % codepoint
names = sys.argv
prev = None
js_regex = ""
for codepoint in range(pow(2, 16)):
if any([unicodeNameMatch(name, codepoint) for name in names]):
if prev is None: js_regex += regexChr(codepoint)
prev = codepoint
else:
if not prev is None: js_regex += "-" + regexChr(prev)
prev = None
print "[" + js_regex + "]"
Вызовите это так: python char_class.py latin digit
и вы получите класс персонажей, упомянутый выше. Это ужасный класс char, но вы точно знаете, , что вы перехватили все символы, имена которых содержат latin
или digit
.
Просмотр базы данных символов Unicode для просмотра имен всех символов Unicode. Имя находится в верхнем регистре после первой точки с запятой, например, для A
это строка
0041;LATIN CAPITAL LETTER A;Lu;0;L;;;;;N;;;;0061;
Попробуйте python char_class.py "latin small"
, и вы получите класс символов для всех латинских строчных букв.
Редактировать : Существует небольшая ошибка (или ошибка) в том, что \u271d-\u271d
происходит в регулярном выражении. Возможно, это исправление поможет: заменить
if not prev is None: js_regex += "-" + regexChr(prev)
от
if not prev is None and prev != codepoint: js_regex += "-" + regexChr(prev)