regex - 飞镖中阿拉伯字符的正则表达式飞镖
问题描述
你好吗?
我是 dart 和 Flutter 的初学者,也是一名新程序员,这是我第一次在 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);
}
});
}
它甚至不打印空值。
解决方案
该\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}+)+
.
推荐阅读
- xml - How to use Sed/xmlparser to update multi line with many uniode characters
- javascript - Determine if two coordinates are within desired radius
- javascript - 可以在将元素返回到新数组之前过滤操作元素吗?
- mysql - Convert SQL Query to ORM Query
- android - 有什么办法可以避免在 Android(Kotlin) 中连续输入相同的代码
- ios - 如果我使用 unwindSegue 从屏幕 A 转到 B 再到 C 又回到 B,如何返回主显示器 (A)
- gradle - 如何在 Gradle 中创建可传递的分层多项目?
- python-3.x - 如何为python中的每个值分配数字
- python - 如何更改空白字符的颜色?
- angular - Angular routing animation: Plays once on refresh