9

I am in need of matching Unicode letters, similarly to PCRE's \p{L}.

Now, since Dart's RegExp class is based on ECMAScript's, it doesn't have the concept of \p{L}, sadly.

I'm looking into perhaps constructing a big character class that matches all Unicode letters, but I'm not sure where to start.

So, I want to match letters like:

foobar
מכון ראות

But the R symbol shouldn't be matched:

BlackBerry®

Neither should any ASCII control characters or punctuation marks, etc. Essentially every letter in every language Unicode supports, whether it's å, ä, φ or ת, they should match if they are actual letters.

4

4 回答 4

7

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

RegExp alpha = RegExp(r'\p{Letter}', unicode: true);
print(alpha.hasMatch("f")); // true
print(alpha.hasMatch("ת")); // true
print(alpha.hasMatch("®")); // false
于 2019-12-02T02:23:17.607 回答
3

我认为 Dart 库中没有关于将 Unicode 字符分类为字母或非字母的完整信息。您也许可以将主要使用 Intl 库中的东西(尤其是 Bidi)的东西放在一起。我在想,例如,

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

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

于 2013-03-21T17:28:17.607 回答
2

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

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

或者采取惰性选项,并提交一个 Dart 错误,然后等待 Dart 团队实现它;)

于 2013-03-21T04:18:43.077 回答
2

Dart 或 JS 中尚不支持此功能。

Xregexp JS 库支持生成相当大的字符类正则表达式来支持类似的东西。您可能能够生成正则表达式,打印它并将其剪切并粘贴到您的应用程序中。

于 2013-03-21T21:28:36.130 回答