使用RegEx匹配Unicode字母

时间:2013-03-20 18:33:26

标签: dart

我需要匹配Unicode字母,类似于PCRE的\p{L}

现在,由于Dart的RegExp类基于ECMAScript,它遗憾地没有\p{L}的概念。

我正在考虑构建一个匹配所有Unicode字母的大字符类,但我不知道从哪里开始。

所以,我想匹配字母,如:

foobar
מכון ראות

但是R符号不应该匹配:

BlackBerry®

任何ASCII控制字符或标点符号等都不应该。在Unicode支持的每种语言中基本上每个字母,无论是å,ä,φ还是ת,如果它们是实际字母,它们应匹配。

4 个答案:

答案 0 :(得分:3)

我认为关于Unicode字符分类为字母或非字母的完整信息不在Dart库中的任何位置。您可以将一些主要用于Intl库中的东西放在一起的东西,尤其是Bidi。我在考虑,例如,

isLetter(oneCharacterString)=> Bidi.endsWithLtr(oneLetterString)|| Bidi.endsWithRTL(oneLetterString);

可能会做一个看似合理的工作。至少它似乎有许多有效字符的范围。或者您可以根据_LTR_CHARS和_RTL_CHARS中的信息将您自己的RegExp组合在一起。它明确表示它不是100%准确,但对大多数实际目的都有好处。

答案 1 :(得分:2)

看起来你将不得不遍历字符串中的符文,然后根据unicode范围表检查整数值。

Golang有一些代码直接从unicode source生成这些表。请参阅go maketables.go以及golang unicode包中的一些其他文件。

或者采取懒惰选项,并提交Dart错误,并等待Dart团队实施它;)

答案 2 :(得分:2)

在Dart或JS中还没有对此的支持。

Xregexp JS库支持生成相当大的字符类regexp来支持这样的事情。您可以生成正则表达式,打印并剪切并粘贴到您的应用程序中。

答案 3 :(得分:0)

我知道这是一个老问题。但是RegExp现在支持unicode categories(自Dart 2.4起),因此您可以执行以下操作:

RegExp alpha = RegExp(r'\p{Letter}', unicode: true);
print(alpha.hasMatch("f")); // true
print(alpha.hasMatch("ת")); // true
print(alpha.hasMatch("®")); // false