Dart 支持在正则表达式中使用脚本属性值



Unicode 正则表达式文档描述了对文本进行复杂的匹配。具体来说,我想知道如何根据代码点的脚本属性值匹配文本字符串中的各种脚本。

有关在正则表达式中使用脚本属性值的 Unicode 文档提到了这种可能性:

script 属性在正则表达式语法中很有用,便于 规范由单个脚本组成的文本范围,或 脚本的混合。通常,正则表达式应使用 特定脚本属性值仅与两者结合使用 通用 和继承。例如,区分字符序列 适合希腊文本,可以使用

((希腊语 |普通((继承 |我 |百万((

前面的表达式匹配具有脚本的所有字符 属性值为希腊语或普通语,可选后跟 脚本属性值为"继承"的字符。为 完整性,正则表达式还允许任何非空格或 封闭标记。

某些语言通常使用多个脚本,因此,例如 区分适合日语文本的字符序列 1 可能使用:

((平假名 |片假名 |韩 |拉丁语 |普通((继承 |我 |百万((

这是在Dart中实现的吗?我没有看到它被描述为 Dart RegEx 或 Dart regexes 所基于的 JavaScript ECMAScript 正则表达式规范。

Dart 早在 2019 年年中就增加了对 Unicode 属性的支持 2.4 版(见 https://github.com/dart-lang/sdk/issues/34935(。但是,有一个问题:要使其正常工作,您需要将可选参数"unicode: true"传递给RegExp((构造函数,以便将您的模式识别为"unicode模式"。我已经测试了以下内容(匹配 {L} 字母、{N} 数字和 {M} 标记(,它与最新的 Dart SDK 配合使用良好:

RegExp(r'[p{L}p{N}p{M}]', unicode: true)

为了匹配希腊字符,按照@daxim的例子:

RegExp exp = RegExp(r'(p{Script=Greek})', unicode: true);
Iterable<RegExpMatch> matches;
matches = exp.allMatches('ΓβγΔδΕεζηΘθ');
for (Match m in matches) {
print('${m.group(1)}');
}

不支持最简单的情况,更不用说设置操作了。经 https://dartpad.dev/测试

void main() {
RegExp exp = new RegExp(r"(p{Script:Greek})");
String str = "Γ";
Iterable<RegExpMatch> matches = exp.allMatches(str);
for (Match m in matches) {
final match = m.group(0);
print(match);
}
}

得到:没有结果

期望: Γ


当你不想失望的时候,使用Perl。

最新更新