首页 > 解决方案 > 飞镖中阿拉伯字符的正则表达式飞镖

问题描述

你好吗?

我是 dart 和 Flutter 的初学者,也是一名新程序员,这是我第一次在 StackOverflow 上提问。

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

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


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);
    }
  });

}

它甚至不打印空值。

标签: regexstringdartunicodehashtag

解决方案


\w字符是 的简写[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}+)+.


推荐阅读