12

我想在希腊文本中使用这个正则表达式new RegExp("\b"+pat+"\b")但 "\b" 元字符只支持 ASCII 字符。

我尝试了 XregExp库,但我没有设法解决这个问题。

任何建议将不胜感激。

4

2 回答 2

4

我认为这对您的回答很有帮助。,

<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/

于 2011-05-12T12:45:26.883 回答
2

所以答案就是,你不能使用 JavaScript 原生机制或任何使用这些机制的库来按照你想要的方式匹配单词。正如您已经说过的, \b 匹配单词。单词必须由单词字符组成。在 JavaScript 中(实际上其他正则表达式实现的单词字符是az、AZ、0-9 和 _。但是许多其他语言只是以 JavaScript 不同的方式实现 \b 元字符。

答案“JavaScript 不支持 Unicode”有点简单,实际上完全错误。JavaScript 只是不将 unicode 用于字符类。如果 JavaScript 不支持 unicode,你甚至不能在字符串文字中使用 unicode 字符,当然这在 JavaScript 中是可能的。

根据ECMA 262 标准(ECMAScript)(第 15.10.2.6 节):

[...] 生产 Assertion :: \ b 通过返回一个内部 AssertionTester 闭包进行评估,该闭包采用 State 参数 x 并执行以下操作:

  1. 设 e 为 x 的 endIndex。
  2. 调用 IsWordChar(e–1) 并将 a 作为布尔结果。
  3. 调用 IsWordChar(e) 并设 b 为布尔结果。
  4. 如果 a 为真且 b 为假,则返回真。
  5. 如果 a 为假且 b 为真,则返回真。
  6. 返回假。[..]

抽象操作 IsWordChar 采用整数参数 e 并执行以下操作:

  1. 如果 e == –1 或 e == InputLength,则返回 false。
  2. 设 c 为字符 Input[e]。
  3. 如果 c 是下面 63 个字符之一,则返回 true。abcdefghijklmnopqrstu vwxyz ABCDEFGHIJKLMNOPQRSTU VWXYZ 0 1 2 3 4 5 6 7 8 9 _
  4. 返回假

这只是表明,\b 使用“isWordChar”的算法来检查您尝试匹配的内容是否实际上是一个单词。在“isWordChar”的定义中,您可以看到哪些字符将为“isWordChar”返回真值的确切定义。

在我看来,这与所使用的字符集完全无关。这里既不是 ASCII 也不是 UNICODE 兼容的。就是这63个字符。

于 2011-05-11T09:43:04.657 回答