dart 中阿拉伯字符的 Regexp dart
Regexp dart for arabic characters in dart
你好吗?
我是 dart 和 flutter 的初学者,我也是一个新的程序员,这是我第一次在 Whosebug 上提问。
我现在正在训练正则表达式,我正在尝试创建一个匹配所有带有标签符号的字符,例如:
#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。
\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)), ],
)
你好吗?
我是 dart 和 flutter 的初学者,我也是一个新的程序员,这是我第一次在 Whosebug 上提问。
我现在正在训练正则表达式,我正在尝试创建一个匹配所有带有标签符号的字符,例如:
#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。
\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)), ],
)