我正在尝试将我的Dart Web应用程序设置为:(1)确定特定字符串是否与给定的正则表达式匹配,以及(2)如果匹配,则从字符串中提取组/段。
具体来说,我想确保给定的字符串具有以下形式:
http://myapp.example.com/#<string-of-1-or-more-chars>[?param1=1¶m2=2]
<string-of-1-or-more-chars>
就是这样:任何1个字符的字符串,以及查询字符串([?param1=1¶m2=2]
)可选的位置。
所以:
<string-of-1-or-more-chars>
组/句段
醇>
这是我最好的尝试:
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”段/组。
答案 0 :(得分:5)
试试这个正则表达式:
String regex = "^http://myapp.example.com/#([^?]+)";
然后抓住:matches.group(1)
答案 1 :(得分:4)
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 :(得分:0)
String regex = "^http://myapp.example.com/#([^?]+)";
然后:
var match = matches.elementAt(0);
print("${match.group(1)}"); // output : fizz