我需要匹配Unicode字母,类似于PCRE的\p{L}
。
现在,由于Dart的RegExp类基于ECMAScript,它遗憾地没有\p{L}
的概念。
我正在考虑构建一个匹配所有Unicode字母的大字符类,但我不知道从哪里开始。
所以,我想匹配字母,如:
foobar
מכון ראות
但是R符号不应该匹配:
BlackBerry®
任何ASCII控制字符或标点符号等都不应该。在Unicode支持的每种语言中基本上每个字母,无论是å,ä,φ还是ת,如果它们是实际字母,它们应匹配。
答案 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