gpt4 book ai didi

regex - 在 Dart 中使用 RegExp 实现模式

转载 作者:行者123 更新时间:2023-12-03 03:19:04 26 4
gpt4 key购买 nike

我想要一个 Pattern我可以很容易地获得模式的基本路径,用于路由,如下所示:

var route = new Pattern('/user');
print(route.path)

会给 '/user' ,但该模式将匹配 r'/user/.*' .

我想象这就足够了:

class Path extends RegExp {
String _path;
Path(this._path): super(path.join(_path, '.*'));
}

但是, RegExp是抽象的,所以它不能工作。但是 RegExp仍然是可实例化的,因为它的构造函数是用 factory 声明的.因此,我发现唯一/最好的解决方案是保留 RegExp对象作为成员:

class Path implements Pattern {
String _path;
RegExp _r;
Path(this._path) {
_r = new RegExp(join(_path, '.*'));
}

Match matchAsPrefix(String string, [int start=0]) {
return _r.matchAsPrefix(string, start);
}

Iterable<Match> allMatches(String str) {
return _r.allMatches(str);
}
}

但是 RegExp的定义仅列出 allMatches ,由 Pattern 指定.但不是所有的 Pattern如果 RegExp 需要执行 s 方法是支持 Pattern ?

我想看看 RegExp 的实现的构造函数,但它被定义为外部的,我找不到正确的文件。

所以正确地提出我的问题,有什么方法可以让我做我最初打算的事情,从实现模式的非抽象类继承?

最佳答案

我建议您查看 Uri类(class)或 Path包,看看它是否不能帮助您满足您的需求(如果不能,请提交功能请求)。将路径或 URI 作为字符串使用可能很脆弱。

无论如何,如果我理解正确,您需要输入 x匹配"$x/"以及之后的一切。这听起来很简单——因为它匹配到字符串的末尾,所以每个字符串只能有一个匹配项。

你可以自己写Pattern执行:

class MyPattern implements Pattern {
final String _pattern;
MyPattern(String prefix) : _pattern = "$prefix/";
Iterable<Match> allMatches(String input) {
int index = input.indexOf(_pattern);
if (index < 0) return null;
return [new _MyMatch(input, this, index)];
}
Match matchAsPrefix(String input, [int start = 0]) {
if (input.startsWith(_pattern, start)) {
return new _MyMatch(input, this, start);
}
return null;
}
}
class _MyMatch implements Match {
final String input;
final Pattern pattern;
final int start;
_MyMatch(this.input, this.pattern, this.start);
int get end => input.length;
int get groupCount => 0;
List<String> groups(Iterable<int> indices) {
var result = <String>[];
for (int i in indices) result.add(group(i));
return result;
}
String group(int index) {
if (index == 0) return input.substring(start);
throw new RangeError.value(index);
}
String operator[](int index) => group(index);
}

关于regex - 在 Dart 中使用 RegExp 实现模式,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/22282894/

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