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

标签 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 需要执行 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/

相关文章:

android - 句子或问题的正则表达式

javascript - 使用 JavaScript 将字符串与正则表达式匹配

ruby-on-rails - 如何使用 rspec 测试命名路由?

.net - ASP.NET MVC 路由和文件路径

dart - 有没有什么办法可以让标签栏固定在顶部,而工具栏会滚动?

dart - 使用Dart googleapis_auth(0.2.2)通过服务帐户授权Google Apps域中的Admin SDK Directory API

firefox-addon - 在Dart中编写firefox扩展是否可行?

正则表达式查找(/替换)字符串中字符的多个实例

regex - 如何在 Perl 中将十六进制解码为负整数值

asp.net-mvc - Asp.net MVC 路由不明确,同一页面有两条路径