我有以下正则表达式\/\/.*\/.*?
,我将其应用于此格式的字符串:mongodb://localhost:27017/admin?replicaSet=rs
根据以上内容,返回的匹配为://localhost:27017/
但是,我不希望//../
字符我只希望结果为:localhost:27017
为了实现这一目标需要修改的内容,我对正则表达式构建还是一个新手。
编辑:我正在使用Java 1.7来执行此正则表达式语句。
答案 0 :(得分:1)
如果您不想使用replaceAll
,可以在Java中使用此Matcher
方法:
System.out.println("mongodb://localhost:27017/admin?replicaSet=rs".replaceAll("mongodb://([^/]*).*", "$1"));
在这里,我假设您有1次出现的mongodb网址。 mongodb://
按字面顺序匹配字符序列,([^/]*)
匹配除/
以外的0个或多个字符的序列,并将它们存储在capturing group 1中(我们将使用反向引用$1
到此组以检索替换模式中的文本)。 .*
匹配所有符号,直到单行字符串的末尾。
请参阅IDEONE demo
或者,Matcher
,
Pattern ptrn = Pattern.compile("(?<=//)[^/]*");
Matcher matcher = ptrn.matcher(str);
while (matcher.find()) {
System.out.println(matcher.group());
}
此处的正则表达式 - (?<=//)[^/]*
- 再次匹配除/
以外的0个或多个字符(带[^/]*
)的序列,但请确保//
在这个序列之前。 (?<=//)
是positive lookbehind,不消耗字符,因此不会在匹配中返回它们。
答案 1 :(得分:0)
您可以结合使用lookbehinds和lookaheads来替换所有&#34; /&#34;喜欢:
(?<=\/\/).+.*(?=\/).*?
将仅从您的查询中匹配localhost:27017
此处(?<=\/\/).
与&#34; //&#34;之后的任何内容匹配串
并且(?=\/)
匹配&#34; /&#34;之前的任何内容;串