【问题标题】:Dart: RegExp by exampleDart:正则表达式示例
【发布时间】:2026-01-16 02:05:01
【问题描述】:

我正在尝试让我的 Dart Web 应用程序:(1) 确定特定字符串是否与给定的正则表达式匹配,以及 (2) 如果匹配,则从字符串中提取一个组/段。

具体来说,我想确保给定的字符串具有以下形式:

http://myapp.example.com/#<string-of-1-or-more-chars>[?param1=1&param2=2]

&lt;string-of-1-or-more-chars&gt; 就是这样:任何 1+ 个字符的字符串,并且查询字符串 ([?param1=1&amp;param2=2]) 是可选

所以:

  1. 判断字符串是否匹配正则表达式;如果是的话
  2. 从字符串中提取&lt;string-of-1-or-more-chars&gt;组/段

这是我最好的尝试:

String testURL = "http://myapp.example.com/#fizz?a=1";
String regex = "^http://myapp.example.com/#.+(\?)+\$";
RegExp regexp= new RegExp(regex);
Iterable<Match> matches = regexp.allMatches(regex);
String viewName = null;
if(matches.length == 0) {
    // testURL didn't match regex; throw error.
} else {
    // It matched, now extract "fizz" from testURL...
    viewName = ??? // (ex: matches.group(2)), etc.
}

在上面的代码中,我知道我错误地使用了 RegExp API(我什至没有在任何地方使用 testURL),最重要的是,我不知道如何使用 RegExp API 来提取 (在这种情况下)URL 中的“fizz”段/组。

【问题讨论】:

    标签: regex dart string-matching


    【解决方案1】:

    RegExp 类带有一个用于单个匹配的便捷方法:

    RegExp regExp = new RegExp(r"^http://myapp.example.com/#([^?]+)");
    var match = regExp.firstMatch("http://myapp.example.com/#fizz?a=1");
    print(match[1]);
    

    注意:我使用了 anubhava 的正则表达式(你的没有正确转义 ?)。

    注意2:尽管这里没有必要,但将原始字符串用于正则表达式通常是一个好主意,因为您不需要在其中转义 $ 和 \。有时使用三引号原始字符串也很方便:new RegExp(r"""some'weird"regexp\$""")

    【讨论】:

      【解决方案2】:

      试试这个正则表达式:

      String regex = "^http://myapp.example.com/#([^?]+)";
      

      然后抓取:matches.group(1)

      【讨论】:

      • 感谢@anubhava (+1) - 如何使用RegExp API 获取matches 实例?
      • @CalifornianAcorn 它位于您链接到的文档的顶部附近。 RegExp exp = new RegExp(r"(\w+)"); String str = "Parse my string"; Iterable&lt;Match&gt; matches = exp.allMatches(str);
      • 这可能会有所帮助:*.com/questions/16522918/…
      【解决方案3】:
      String regex = "^http://myapp.example.com/#([^?]+)";
      

      然后:

      var match = matches.elementAt(0);
      print("${match.group(1)}"); // output : fizz
      

      【讨论】:

      • NoSuchMethodError: Closure call with mismatched arguments: function 'elementAt' 因为没人知道匹配是什么