我正在尝试使用 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/?)
!!
当我删除(/.*|$)
时部分,均退回!但我想要这个结束条件来确保参数后跟斜线或位于行尾...
你知道为什么吗(/.*|$)
防止找到第二个参数?
最佳答案
您可以使用以下正则表达式:-
"(?:/|^)(\\(\\?<.*?>.*?\\))(?=/|$)"
并使用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)
最后一个不会被打印,因为它后面既没有斜线
,也没有行尾
。
关于java - 正则表达式: "is followed by a slash or is the end of the line",我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13663329/