Регулярное выражение JavaScript для ловли кандзи - PullRequest
4 голосов
/ 08 сентября 2011

Я не могу заставить эту функцию javascript работать так, как я хочу ...

// соответствует строке, содержащей символы кандзи и / или кана

String.prototype.isKanjiKana = function(){
    return !!this.match(/^[\u4E00-\u9FAF|\u3040-\u3096|\u30A1-\u30FA|\uFF66-\uFF9D|\u31F0-\u31FF]+$/);
}

он возвращает TRUE, если строка состоит из символов кандзи и / или каны, FALSE, если присутствует алфавит или другие символы.

Я бы хотел вернуть, если хотя бы 1 символ кандзи и / или канапредставьте вместо этого, что если все они.

Заранее благодарю за любую помощь!

Ответы [ 4 ]

6 голосов
/ 08 сентября 2011

Правильный ответ , а не для жестких кодов. Никогда не используйте магические числа в своем коде Это кошмар обслуживания. Трудно читать, трудно писать, трудно отлаживать, трудно поддерживать. Откуда ты знаешь, что ты правильно понял цифры? Что происходит, когда они добавляют новые? Нет, не используйте магические числа. Пожалуйста.

Правильный ответ - использовать именованные сценарии Unicode, которые являются фундаментальным аспектом каждой кодовой точки Unicode:

[\p{Han}\p{Hiragana}\p{Katakana}]

Для этого требуется плагин XRegExp для Javascript.

Настоящая проблема заключается в том, что регулярные выражения Javascript слишком примитивны для поддержки свойств Unicode и, следовательно, для поддержки Unicode. Возможно, когда-то это был приемлемый компромисс 15 лет назад, но сегодня это не что иное, как невыносимая небрежность, как вы сами обнаружили.

Вы также пропустите несколько Common кодовых точек, указанных как kana в новом свойстве Script Extensions, но, вероятно, неважно. Вы можете просто добавить \p{Common} к указанному выше.

2 голосов
/ 08 сентября 2011
String.prototype.isKanjiKana = function(){
    return !!this.match(/[\u4E00-\u9FAF\u3040-\u3096\u30A1-\u30FA\uFF66-\uFF9D\u31F0-\u31FF]/);
}

Не привязывайте его к началу и концу строки с помощью $^, и + в этом случае бесполезно.

1 голос
/ 08 сентября 2011
/[\u4E00-\u9FAF|\u3040-\u3096|\u30A1-\u30FA|\uFF66-\uFF9D|\u31F0-\u31FF]/
0 голосов
/ 01 мая 2019

Теперь, когда экранирование свойств Unicode является частью спецификации ES (2018), следующее регулярное выражение можно использовать изначально, если механизм JS поддерживает эту функцию (расширение ответа @ tchrist):

/[\p{Script_Extensions=Han}\p{Script_Extensions=Hiragana}\p{Script_Extensions=Katakana}]/u
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...