Javascript Unicode (греческий) регулярные выражения - PullRequest
12 голосов
/ 13 апреля 2011

Я хотел бы использовать это регулярное выражение new RegExp ("\ b" + pat + "\ b") в греческом тексте, но метасимвол "\ b" поддерживает только символы ASCII.

Я пытался XregExp библиотека, но мне не удалось решить проблему.

Любые предложения будут с благодарностью.

Ответы [ 2 ]

4 голосов
/ 12 мая 2011

Я думаю, что это было полезно для вашего ответа.,

<script src="xregexp.js"></script>
<script src="xregexp-unicode-base.js"></script>
<script>
    var unicodeWord = XRegExp("^\\p{L}+$");

    unicodeWord.test("Русский"); // true
    unicodeWord.test("日本語"); // true
    unicodeWord.test("العربية"); // true
</script>

<!-- \p{L} is included in the base script, but other categories, scripts,
and blocks require token packages -->
<script src="xregexp-unicode-scripts.js"></script>
<script>
    XRegExp("^\\p{Katakana}+$").test("カタカナ"); // true
</script>

Пожалуйста, укажите следующее местоположение: http://xregexp.com/plugins/

2 голосов
/ 11 мая 2011

Таким образом, ответ прост: вы не можете использовать нативные механизмы JavaScript или любую библиотеку, которая использует эти механизмы для сопоставления слов так, как вы хотите.Как вы уже сказали, \ b соответствует словам.Слова должны состоять из символов слова.И в JavaScript (и на самом деле в других реализациях регулярных выражений символами слова являются az, AZ, 0-9 и _ . Но многие другие языки просто реализуют метасимвол \ b другим способом, чем JavaScript.

Ответ «JavaScript не поддерживает Юникод» немного прост и на самом деле совершенно неправильный. JavaScript просто не использует юникод для классов символов. Если JavaScript не поддерживает юникод, вы даже не можете использовать символы Юникода в строкелитералы и, конечно, это возможно в JavaScript.

Согласно Стандарту ECMA 262 (ECMAScript) (Раздел 15.10.2.6):

[...]Для вычисления Assertion :: \ b возвращается внутреннее замыкание AssertionTester, которое принимает аргумент State x и выполняет следующее:

  1. Пусть e будет endIndex для x.
  2. Вызов IsWordChar (e–1) и пусть a будет логическим результатом.
  3. Вызовите IsWordChar (e) и пусть b будет логическим результатом.
  4. Если a равно true, а b равно falseе, верни истину.
  5. Если a равно false и b равно true, вернуть true.
  6. Вернуть ложь.[..]

Абстрактная операция IsWordChar принимает целочисленный параметр e и выполняет следующее:

  1. Если e == –1 или e == InputLength, вернуть false,
  2. Пусть c будет символом Input [e].
  3. Если c - один из шестидесяти трех символов ниже, верните true.abcdefghijklmnopqrstu vwxyz ABCDEFGHIJKLMNOPQRSTU VWXYZ 0 1 2 3 4 5 6 7 8 9 _
  4. Вернуть false

Это просто показывает, что \ b использует алгоритм «isWordChar» для проверки, еслито, что вы пытаетесь сопоставить, на самом деле является словом.В определении «isWordChar» вы можете увидеть точное определение того, какие символы будут возвращать true для «isWordChar».

В моем мнении это не имеет абсолютно никакого отношения к используемому набору символов.Это ни ASCII, ни UNICODE компилятор здесь.Это всего лишь 63 персонажа.

...