JavaScript Unicode(希腊语)正则表达式

12
我想在希腊文本中使用这个正则表达式 new RegExp("\b"+pat+"\b"),但"\b"字符元只支持ASCII字符。
我尝试了XregExp库,但没有解决这个问题。
非常感谢您提供任何建议。

2
尽管Unicode是Web上的主要字符集,但Javascript不支持它。使用一个支持Unicode的语言,最好是至少符合基本Unicode正则表达式支持的Level 1要求的语言。 - tchrist
@tchrist:没错。那么你建议在浏览器脚本中使用哪种语言? - Tim Down
1
@Martinho,正如我在我的回答中所解释的那样,XRegExp插件不能将\b正确地修正为符合Unicode标准要求的工作方式。它无法仅使用Unicode通用类别进行正确实现,即使是其近似值也令人费解:(?:(?<=\w)(?!\w)|(?<!\w)(?=\w))。您必须在出现的每个位置上将\w替换为[\pL\pM\p{Nd}\p{Nd}\p{Pc}],但您无法这样做——因为Javascript无法管理标准的向后查找。因此,该插件无法解决此问题。 - tchrist
1
@Tim:因为ECMA标准和几乎所有的实现都拖延了这么长时间,以至于它们已经过时了十多年,我想不到任何替代方案,只能将更多的重活交给服务器端后端处理。ICU正则表达式库和Perl都符合Unicode标准的Level-1(plus)级别,所以两者都可以很好地处理Unicode。此外,PHP、Ruby 1.9和Python(按照这个顺序)在符合性方面比Javascript更进一步,至少可以满足OP的需求。很抱歉没有好消息。 - tchrist
显示剩余6条评论
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/ 该网站涉及IT技术相关内容。

2
答案就是,你不能使用 JavaScript 原生机制或任何使用这些机制的库来按照你想要的方式匹配单词。就像你已经说过的那样,\b 可以匹配单词。单词必须由单词字符组成。在 JavaScript 中(实际上其他正则表达式实现中),单词字符是 a-z、A-Z、0-9 和 _。但是许多其他语言以不同于 JavaScript 的方式实现 \b 元字符。
“JavaScript 不支持 Unicode” 的答案有点简单了,实际上完全错误。JavaScript 只是不使用 unicode 来表示字符类。如果 JavaScript 不支持 Unicode,则甚至无法在字符串文字中使用 Unicode 字符,当然这在 JavaScript 中是可能的。
根据 ECMA 262 Standard(ECMAScript)(第 15.10.2.6 节):
[...] 断言 :: \ b 的产生通过返回一个内部 AssertionTester 闭包来评估,该闭包采用 State 参数 x 并执行以下操作:
  1. 令 e 为 x 的 endIndex。
  2. 调用 IsWordChar(e–1) 并将结果赋值给布尔变量 a。
  3. 调用 IsWordChar(e) 并将结果赋值给布尔变量 b。
  4. 如果 a 为 true 而 b 为 false,则返回 true。
  5. 如果 a 为 false 而 b 为 true,则返回 true。
  6. 返回 false。 [..]

抽象操作 IsWordChar 接受一个整数参数 e,并执行以下操作:

  1. 如果 e == –1 或 e == InputLength,则返回 false。
  2. 令 c 为字符 Input[e]。
  3. 如果 c 是以下六十三个字符之一,则返回 true。 a b c d e f g h i j k l m n o p q r s t u v w x y z A B C D E F G H I J K L M N O P Q R S T U V W X Y Z 0 1 2 3 4 5 6 7 8 9 _
  4. 返回 false。
这只是说明,\b使用“isWordChar”算法来检查你尝试匹配的内容是否为单词。在“isWordChar”的定义中,你可以看到哪些字符将返回“true”。

在我看来,这与所使用的字符集完全无关。它既不符合ASCII也不符合UNICODE。只涉及这63个字符。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接