JavaScript正则表达式:西里尔字母模式

3

我知道这可能是一个愚蠢的问题,但是我已经花费了两天的时间在谷歌上搜索,没有任何结果。 允许用户只输入 Cyrillic 字符和空格的正则表达式模式应该是什么? 提前感谢您!


限制用户使用特定字符有何原因? - Matti Virkkunen
@Matti:这是一个非常好的问题。通常情况下,您不希望这样做,但有时限制输入字段仅为十进制数字\p{Nd}、数字\pN、数学符号\p{Math}、字母\pL、字母表\p{Alphabetic}或者尤其是只包含一个或两个脚本或类型为Common的字符是合理的。这可以避免一些安全陷阱,例如B≢Β≢В(即U+0042拉丁大写字母B与U+0392希腊大写字母BETA和U+0412西里尔大写字母VE)。然而,有些情况是棘手的。 - tchrist
2个回答

2
你无法在JavaScript中执行此操作,因为JavaScript在其正则表达式中甚至没有提供基本的Level 1 Unicode support。你需要切换语言才能正确执行此操作。
你不能使用枚举块范围来执行此操作。这会混淆块和脚本,这是一个严重的缺陷。有150个代码点具有\p{Script=Cyrillic}属性,但缺少\p{Block=Cyrillic}属性。它们位于不同的块中。看:
$ unichars '\p{Script=Cyrillic}' '\P{Block=Cyrillic}' | wc -l
150

此文段的英译如下:

此外,在Cyrillic块中还有一些非Cyrillic代码点。

你能做的最好的事情是将所有404个Cyrillic代码点列举为字符类,但这可能会变得难以实现。

$ unichars '\p{Script=Cyrillic}'  | wc -l
404

你可以使用unichars脚本列出所有这些字符,如果你真的想要的话。在那里你也可能想要获取uniprops脚本

好的。我该如何用PHP进行测试呢?我会尝试使用Ajax。 - Emil Avramov
@Emil:我认为如果你使用PHP的preg(“perl regex”)函数,你应该能够使用字符类似[\s\p{IsCyrillic}],因为\p{IsCyrillic}应该是\p{Script=Cyrillic}的别名。还有其他几种可能的语言,但基本上你必须支持Unicode脚本属性才能使其正常工作。顺便说一句,你可能还想通过\p{IsCommon}允许任何脚本类型的字符。这些是常规标点符号和空格等。我提到的uniprops脚本可以列出所有代码点的属性。 - tchrist
@Emil:阅读 pcrepattern 手册以了解 preg 模式在 PHP 中的工作方式后,发现如果 PHP 链接的 PCRE 库已经构建/编译为支持 Unicode(这取决于站点),那么 PCRE 和 PHP 将使用脚本属性的快捷别名,因此 \p{Cyrillic} 是表示 \p{Script=Cyrillic} 的方法。您还可以使用 Perl 5.6 或更高版本、Ruby 1.9 或更高版本或 Java 1.7 或更高版本来访问脚本属性。注意:不能使用 C♯,因为它的 \p{Cyrillic} 是恶意的 \p{Block=Cyrillic} 而不是 \p{Script=Cyrillic} - tchrist
$pattrn = "/[\sабвгдАБВГД]/" preg_match($myvar, $pattern);$pattrn = "/[\sабвгдАБВГД]/" preg_match($myvar, $pattern); - Emil Avramov
@Emil:我不知道你有特定的西里尔字母在脑海中! - tchrist
我没有。这只是一个例子。 - Emil Avramov

0

有一个小技巧可以让这个工作(不过它的准确性并不是很可靠,因此在使用之前请仔细检查):

`/^[\u0400-\u04FF\s]+$/`
(/^[\u0400-\u04FF\s]+$/).test("Привет мир") //true

虽然我不太确定 Unicode 的支持情况,但根据维基百科的说法,西里尔字母范围内的字符通常位于(U+0400-U+04FF)之间,而此正则表达式还包括空格,这段代码在我的浏览器控制台中可以运行。


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