gpt4 book ai didi

regex - dart:使用正则表达式拆分字符串并包含分隔符

转载 作者:行者123 更新时间:2023-12-03 03:01:09 25 4
gpt4 key购买 nike

在 Dart 中,我想使用正则表达式拆分字符串,并在结果列表中包含匹配的分隔符。因此,使用分隔符 . ,我希望将字符串 123.456.789 拆分为 [ 123, ., 456, ., 789 ]

在某些语言中,如 C#、JavaScript、Python 和 Perl,根据 https://stackoverflow.com/a/15668433 的说法,这可以通过简单地在捕获括号中包含分隔符来完成。该行为似乎记录在 https://ecma-international.org/ecma-262/9.0/#sec-regexp.prototype-@@split

但是,这在 Dart 中似乎不起作用:
print("123.456.789".split(new RegExp(r"(\.)")));
产生与没有括号完全相同的东西。有没有办法让 split() 在 Dart 中像这样工作?否则我想它必须是一个 allMatches() 实现。

编辑:为正则表达式放置 ((?<=\.)|(?=\.)) 显然可以完成单个分隔符的工作,具有后视和前瞻。我实际上会有一堆分隔符,我不确定这种方法的效率。有人可以建议是否可以吗?易读性肯定会降低:要允许分隔符 .; ,是否需要((?<=\.)|(?=\.)|(?<=;)(?=;))或者((?<=\.|;)|(?=\.|;)
测试
print("123.456.789;abc;.xyz.;ABC".split(new RegExp(r"((?<=\.|;)|(?=\.|;))")));
表明两者都有效。

最佳答案

标准库中没有直接支持它,但是基于 RegExp.allMatches() 推出自己的实现是相当简单的。例如:

extension RegExpExtension on RegExp {
List<String> allMatchesWithSep(String input, [int start = 0]) {
var result = <String>[];
for (var match in allMatches(input, start)) {
result.add(input.substring(start, match.start));
result.add(match[0]);
start = match.end;
}
result.add(input.substring(start));
return result;
}
}

extension StringExtension on String {
List<String> splitWithDelim(RegExp pattern) =>
pattern.allMatchesWithSep(this);
}

void main() {
print("123.456.789".splitWithDelim(RegExp(r"\.")));
print(RegExp(r" ").allMatchesWithSep("lorem ipsum dolor sit amet"));
}

关于regex - dart:使用正则表达式拆分字符串并包含分隔符,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/59547040/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com