我希望有一个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
,是否需要实施所有Pattern
方法?
我想查看RegExp
的构造函数的实现,但它被定义为外部的,我找不到正确的文件。
如此正确地表达我的问题,有没有办法让我做我原本打算做的事情,从一个实现模式的非抽象类继承?
答案 0 :(得分:3)
我建议您查看Uri
类或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);
}
答案 1 :(得分:0)
我认为你做得很好(RegExp作为会员)。
具有工厂构造函数的抽象类是一个用于防止从RegExp派生的构造。
external
关键字是从以后其他地方绑定到具体实现的技巧(VM或JS,请参阅https://www.dartlang.org/docs/spec/latest/dart-language-specification.html#h.lkkt75qhbiwh)。
这就是为什么可以实例化抽象类以及为什么RegExp
不必实现regexp.dart
文件中的所有方法的原因。