Javascript regex буквенно-цифровой английский и японский

Я пытаюсь создать регулярное выражение, которое позволяет использовать только символы A-Z + ints 0-9 вместе с тире и подчеркиванием _, но также и японские символы.

$.validator.addMethod("alphaDash", function(value, element) {
        return this.optional(element) || /^[a-zA-Z0-9-_]+$/i.test(value);
      }, "Username must contain only letters, numbers, dashes or underscores.");

Регулярное выражение выше / ^ [a-zA-Z0-9 -_] + $ / работает только для английских символов, как я могу заставить его принимать японские символы? Хирагана / катакана / кандзи


person Kiow    schedule 27.04.2017    source источник
comment
comment
FWIW, XRegExp lib чертовски крутая: xregexp.com/plugins/#unicode   -  person T.J. Crowder    schedule 27.04.2017
comment
Подходит ли вам ^[\u3040-\u30ff\u3400-\u4dbf\u4e00-\u9fff\uf900-\ufaff\uff66-\uff9fa-zA-Z0-9-_]+$?   -  person Wiktor Stribiżew    schedule 27.04.2017
comment
@ WiktorStribiżew О, да, код unix, он должен работать!   -  person Kiow    schedule 27.04.2017
comment
Будьте осторожны, так как это диапазоны скриптов, они не соответствуют только буквам / цифрам. Возможно, вам действительно нужно использовать XRegExp и его конструкции \pL и \pN для сопоставления любой буквы и цифры Unicode.   -  person Wiktor Stribiżew    schedule 27.04.2017
comment
@ WiktorStribiżew Я пробовал использовать библиотеку с этим: /[a-zA-Z0-9-_\p{Hiragana}\p{Katakana}]+$/, но ничего не получается Если моя строка заканчивается символом хирагана или катакана, которого я не хочу   -  person Kiow    schedule 27.04.2017
comment
Не могли бы вы поделиться строкой, с которой вы тестировали?   -  person Wiktor Stribiżew    schedule 27.04.2017
comment
@ WiktorStribiżew wer え завершится ошибкой, wer え 3 пройдет   -  person Kiow    schedule 27.04.2017
comment
Я получил true в обоих случаях.   -  person Wiktor Stribiżew    schedule 27.04.2017
comment
@ WiktorStribiżew мой код $.validator.addMethod("alphaDash", function(value, element) { return this.optional(element) || /[a-zA-Z0-9-_\p{Hiragana}\p{Katakana}]+$/i.test(value); }, "Username must contain only letters, numbers, dashes or underscores.");   -  person Kiow    schedule 27.04.2017
comment
Извините, вы все делаете неправильно. Вы не можете использовать свойства Unicode, такие как \p{Han} (это соответствует всем китайским символам) с собственным JS RegExp. Вы должны сослаться на XRegExp библиотеку.   -  person Wiktor Stribiżew    schedule 27.04.2017
comment
@ WiktorStribiżew заставил это работать: $.validator.addMethod("alphaDash", function(value, element) { var re = XRegExp('^[a-zA-Z0-9-_\\p{Hiragana}\\p{Katakana}]+$'); return this.optional(element) || re.test(value); }, "Username must contain only letters, numbers, dashes or underscores.");   -  person Kiow    schedule 27.04.2017
comment
Да, но [a-zA-Z0-9_] = \w. Кроме того, разве вам не нужно сопоставить и кандзи? Вы включили только хирагану и катакану.   -  person Wiktor Stribiżew    schedule 27.04.2017
comment
Я добавил ответ на основании этого.   -  person Wiktor Stribiżew    schedule 27.04.2017


Ответы (3)


В соотв. в сценарии XRegExp Unicode:

  • Регулярное выражение хирагана (\p{Hiragana}) char: [\u3041-\u3096\u309D-\u309F]|\uD82C\uDC01|\uD83C\uDE00
  • Катакана (\p{Katakana}) символьное регулярное выражение: [\u30A1-\u30FA\u30FD-\u30FF\u31F0-\u31FF\u32D0-\u32FE\u3300-\u3357\uFF66-\uFF6F\uFF71-\uFF9D]|\uD82C\uDC00
  • Кандзи (\p{Han}): [\u2E80-\u2E99\u2E9B-\u2EF3\u2F00-\u2FD5\u3005\u3007\u3021-\u3029\u3038-\u303B\u3400-\u4DB5\u4E00-\u9FD5\uF900-\uFA6D\uFA70-\uFAD9]|[\uD840-\uD868\uD86A-\uD86C\uD86F-\uD872][\uDC00-\uDFFF]|\uD869[\uDC00-\uDED6\uDF00-\uDFFF]|\uD86D[\uDC00-\uDF34\uDF40-\uDFFF]|\uD86E[\uDC00-\uDC1D\uDC20-\uDFFF]|\uD873[\uDC00-\uDEA1]|\uD87E[\uDC00-\uDE1D]

Вы можете использовать XRegExp (что предпочтительнее, поскольку библиотека постоянно обновляется):

var rx = new XRegExp("^[-\\w\\p{Hiragana}\\p{Katakana}\\p{Han}]+$");
console.log(XRegExp.test("werえ", rx));
console.log(XRegExp.test("werえ3", rx));
<script src="https://cdnjs.cloudflare.com/ajax/libs/xregexp/3.2.0/xregexp-all.min.js"></script>

Или вы можете использовать эти диапазоны для создания регулярного выражения, которое вам придется поддерживать позже:

var pHiragana = "[\\u3041-\\u3096\\u309D-\\u309F]|\\uD82C\\uDC01|\\uD83C\\uDE00";
var pKatakana = "[\\u30A1-\\u30FA\\u30FD-\\u30FF\\u31F0-\\u31FF\\u32D0-\\u32FE\\u3300-\\u3357\\uFF66-\\uFF6F\\uFF71-\\uFF9D]|\\uD82C\\uDC00";
var pHan = "[\\u2E80-\\u2E99\\u2E9B-\\u2EF3\\u2F00-\\u2FD5\\u3005\\u3007\\u3021-\\u3029\\u3038-\\u303B\\u3400-\\u4DB5\\u4E00-\\u9FD5\\uF900-\\uFA6D\\uFA70-\\uFAD9]|[\\uD840-\\uD868\\uD86A-\\uD86C\\uD86F-\\uD872][\\uDC00-\\uDFFF]|\\uD869[\\uDC00-\\uDED6\\uDF00-\\uDFFF]|\\uD86D[\\uDC00-\\uDF34\\uDF40-\\uDFFF]|\\uD86E[\\uDC00-\\uDC1D\\uDC20-\\uDFFF]|\\uD873[\\uDC00-\\uDEA1]|\\uD87E[\\uDC00-\\uDE1D]";
var rx = new RegExp("^([\\w-]|" + pHiragana + "|" + pKatakana + "|" + pHan + ")+$");
console.log(rx.test("werえ"));
console.log(rx.test("werえ3"));

person Wiktor Stribiżew    schedule 27.04.2017

Вы можете использовать что-то вроде:

/^[぀-ゟ゠-ヿ一-龯\w]+$/gu
person Thomas Ayoub    schedule 27.04.2017

Вот пример регулярного выражения, которое соответствует хирагане (юникод 3040-309F): /[a-zA-Z0-9_\u3040-\u309F]+/ http://regexr.com/3frf9

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

person jas7457    schedule 27.04.2017