正则表达式:“后跟斜线或是行的结尾”

时间:2012-12-01 20:16:20

标签: java regex

使用Java,我正在尝试编写一个解析另一个正则表达式的正则表达式。我想从源正则表达式中提取命名组(它们表示由URL中的斜杠分隔的参数)。此外,源字符串可能会也可能不会以斜杠开头和结尾。

例如,对于两个源字符串:

(?<name>john)/(?<facet>aaa/bbb/ccc/?)

/(?<name>john)/(?<facet>aaa/bbb/ccc/?)/

我想要一个正则表达式,将其作为命名组提取:

(?<name>john)(?<facet>aaa/bbb/ccc/?)

我试过了:

(^|.*/)(?<param>\(\?<[^>]+>[^\)]+\))(/.*|$)

但这仅返回(?<name>john)作为名为“param”的组,而不是(?<facet>aaa/bbb/ccc/?) !!

当我删除(/.*|$)部分时,两者都会被退回!但我希望这个结束条件确保一个参数后面跟一个斜杠或者在该行的末尾......

你知道为什么(/.*|$)会阻止找到第二个参数吗?

2 个答案:

答案 0 :(得分:1)

看起来是你的朋友:(?=\/|\n)

这里有一个你需要的例子。 EXAMPLE

答案 1 :(得分:1)

您可以使用以下正则表达式: -

"(?:/|^)(\\(\\?<.*?>.*?\\))(?=/|$)"

并使用Matcher@find方法提取所有匹配项。

String str = "(?<name>john)/***(?<facet>aaa/bbb/ccc/?)/(?<not>aaa/bbb/?)***";
Matcher matcher = Pattern.compile("(?:/|^)(\\(\\?<.*?>.*?\\))(?=/|$)").matcher(str);

while (matcher.find()) {
    System.out.println(matcher.group(1));
}

输出: -

(?<name>john)

最后一张未打印,因为后面没有slashend of line