dart 中阿拉伯字符的 Regexp dart

Regexp dart for arabic characters in dart

你好吗?

我是 dart 和 flutter 的初学者,我也是一个新的程序员,这是我第一次在 Whosebug 上提问。

我现在正在训练正则表达式,我正在尝试创建一个匹配所有带有标签符号的字符,例如:

无论如何,一切都很好,但实际上,当我尝试用阿拉伯语替换英语字符串时,我卡住了。


void main() {
  String text = "#اسمي_هنا";
  RegExp exp = new RegExp(r"\B#\w\w+" , unicode: true , multiLine: true);
  exp.allMatches(text).forEach((match) {
    print(match.group(0));

    if (match.group(0) == null) {
      print(null);
    }
  });

}

它甚至不打印 null。

\w 字符是 shorthand [A-Za-z0-9_]。在您的情况下,您使用的是阿拉伯字母,因此表达式将不匹配,因为 A-Z 属于拉丁字母。

绕过它的一种方法是使用 \p{L},这基本上会匹配 任何字母 ,无论语言如何。有关该主题的更多信息,您可以查看对 unicode 匹配感兴趣的正则表达式。

编辑: 根据您的评论,表达式这一部分的问题:#\p{L}+[_]+\p{L}+,引擎 期望 一个散列,字母(一个或多个),后跟一个下划线(一个或多个)后跟字母(一个或多个)。

在您的另一个示例中,我们可以使用以下形式的字符串:#foo#foo_bar,我们需要修改表达式,使 _bar 部分是可选的。为此,我们按如下方式更改表达式:#\p{L}+([_]+\p{L}+)?。在这种情况下,引擎现在期望 #foo#foo_bar。如果您需要匹配任何形式:#foo_bar_hello,您也可以使用 #\p{L}+([_]+\p{L}+)+.

在尝试实际做我想做的事后,我发现最好的解决方案是:

RegExp exp = new RegExp(r"([#][^\s#]*)");
  String str = "#الالاا_سيسيسشي_لأيبيبالابل";
  exp.allMatches(str).forEach((m) {
    print(
      m.group(0),
    );
  });
TextField
(
        inputFormatters: 
        [ WhitelistingTextInputFormatter(RegExp("[a-z\u0621-\u064a-\ ]",unicode: true)), ],
)