正则表达式飞镖,用于飞镖中的阿拉伯字符

时间:2019-12-23 14:15:14

标签: regex string dart unicode hashtag

你好吗?

我是飞镖和飞镖的初学者,也是新手程序员,这是我第一次在StackOverflow上提问。

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

  • #I_am_here
  • #Stop

无论如何,一切正常,但是实际上,当我尝试用阿拉伯语替换英语字符串时,我会卡住。


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。

3 个答案:

答案 0 :(得分:0)

\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}+)+

答案 1 :(得分:0)

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

RegExp exp = new RegExp(r"([#][^\s#]*)");
  String str = "#الالاا_سيسيسشي_لأيبيبالابل";
  exp.allMatches(str).forEach((m) {
    print(
      m.group(0),
    );
  });

答案 2 :(得分:0)

TextField
(
        inputFormatters: 
        [ WhitelistingTextInputFormatter(RegExp("[a-z\u0621-\u064a-\ ]",unicode: true)), ],
)