防止正则表达式匹配斜杠字符

时间:2015-07-13 16:22:07

标签: java regex

我有以下正则表达式\/\/.*\/.*?,我将其应用于此格式的字符串:mongodb://localhost:27017/admin?replicaSet=rs

根据以上内容,返回的匹配为://localhost:27017/但是,我不希望//../字符我只希望结果为:localhost:27017

为了实现这一目标需要修改的内容,我对正则表达式构建还是一个新手。

编辑:我正在使用Java 1.7来执行此正则表达式语句。

2 个答案:

答案 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;之前的任何内容;串