你好吗?
我是飞镖和飞镖的初学者,也是新手程序员,这是我第一次在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。
答案 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)), ],
)