8

为了练习,我决定构建类似Backbone路由器的东西。用户只需要给出正则表达式字符串r'^first/second/third/$',然后将其挂钩到View.

例如,假设我有RegExp这样的:

String regexString = r'/api/\w+/\d+/';
RegExp regExp = new RegExp(regexString);
View view = new View(); // a view class i made and suppose that this view is hooked to that url

并且HttRequest指向/api/topic/1/并且将匹配该正则表达式,然后我可以将任何挂钩呈现到该网址。

问题是,从上面的正则表达式中,我怎么知道\w+and\d+值是topicand 1

愿意给我一些指点吗?谢谢你。

4

1 回答 1

19

您需要将要提取的部分分组,以便从匹配中提取它们。这是通过将模式的一部分放在括号内来实现的。

// added parentheses around \w+ and \d+ to get separate groups 
String regexString = r'/api/(\w+)/(\d+)/'; // not r'/api/\w+/\d+/' !!!
RegExp regExp = new RegExp(regexString);
var matches = regExp.allMatches("/api/topic/3/");

print("${matches.length}");       // => 1 - 1 instance of pattern found in string
var match = matches.elementAt(0); // => extract the first (and only) match
print("${match.group(0)}");       // => /api/topic/3/ - the whole match
print("${match.group(1)}");       // => topic  - first matched group
print("${match.group(2)}");       // => 3      - second matched group

但是,给定的正则表达式也将匹配"/api/topic/3/ /api/topic/4/",因为它没有锚定,并且它将有 2 个匹配项(matches.length将是 2 个) - 每个路径一个,因此您可能希望使用它来代替:

String regexString = r'^/api/(\w+)/(\d+)/$';

这确保了正则表达式从字符串的开头到结尾准确地锚定,而不仅仅是字符串内的任何位置。

于 2013-05-13T13:47:09.193 回答