在Dart中使用RegEx实现模式

时间:2014-03-09 13:38:48

标签: regex routing dart

我希望有一个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的构造函数的实现,但它被定义为外部的,我找不到正确的文件。

如此正确地表达我的问题,有没有办法让我做我原本打算做的事情,从一个实现模式的非抽象类继承?

2 个答案:

答案 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文件中的所有方法的原因。