我有以下可以
的部分网址/它/ XYZ /测试/ PARAM + 1 / PARAM-2/1234 / gfd4
基本上两个字母在开头斜线另一个未知字符串然后是斜线之间的一系列可重复字符串 我需要捕获每个字符串(我知道用/分隔符分割会很好,但我很想知道如何用正则表达式提取)。我先出来了:
^\/([a-zA-Z]{2})\/([a-zA-Z]{1,10})(\/[a-zA-Z1-9\+\-]+)
但它只捕获
group1:它 group2:xyz group3:/ test
当然它会忽略字符串的其余部分。
如果我在最后添加*符号,它只捕获最后一句:
^\/([a-zA-Z]{2})\/([a-zA-Z]{1,10})(\/[a-zA-Z1-9\+\-]+)*
group1:它 group2:xyz group3:/ gfd4
所以,我显然缺少一些基础知识,所以除了正确的正则表达式之外,我想要一个解释。
我标记为Java,因为解析正则表达式的引擎是JDK 7.据我所知,每个引擎可能都有差异。
答案 0 :(得分:0)
作为mentioned here,这是预期的:
在模式中有一个组,您只能在该组中获得一个确切的结果 如果您的捕获组被模式重复(您在周围的非捕获组中使用了+量词),则只存储与其匹配的最后一个值。
我宁愿捕获group3中的其余字符串((\/.*$)
,如in this demo),然后使用'/'分割。或者在字符串的其余部分应用yhat模式:
Pattern p = Pattern.compile("(\/[a-zA-Z1-9\+\-]+)");
Matcher m = p.matcher(str);
while (m.find()) {
String place = m.group(1);
...
}