2015-07-13 4 views
3

У меня есть следующее регулярное выражение \/\/.*\/.*? и я подаю его строки в следующем формате: mongodb://localhost:27017/admin?replicaSet=rsПредотвращение регулярных выражений из сопоставления слэш символов

Исходя из изложенного выше возвращенного матча: //localhost:27017/ однако, я не хочу, чтобы //../ символы Я хочу, чтобы результат был следующим: localhost:27017

Что нужно изменить для достижения этого, я довольно новичок в создании регулярных выражений.

Редактировать: Я использую Java 1.7 для выполнения этого оператора регулярных выражений.

+0

Можете ли вы использовать lookbehinds? '(? <= \/\ /) [^ \ /] *'. –

+0

На каком языке вы используете? Возможно, вам лучше использовать существующий код, который извлекает имя хоста и номер порта из URL-адресов, а не вмешивается в регулярное выражение, чтобы сделать это. –

+0

Я использую Java 1.7, любые рекомендации? –

ответ

1

Вы можете использовать этот подход replaceAll в Java, если вы не хотите использовать Matcher:

System.out.println("mongodb://localhost:27017/admin?replicaSet=rs".replaceAll("mongodb://([^/]*).*", "$1")); 

Здесь, я полагаю, у вас есть 1 вхождение MongoDB URL. 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, который не потребляет символов и, таким образом, не возвращает их в матче.

+0

Спасибо, мог бы объяснить, что он на самом деле делает? –

+0

Я добавил объяснения и некоторые ссылки.Пожалуйста, дайте мне знать, если что-то неясно об этом. Многим людям не нравится «Matcher», так как для этого требуется добавить еще один «импорт» и больше кода, но он помогает вам получать совпадения или захватывать группы по отдельности. –

0

Вы можете использовать комбинацию просмотра назад и lookaheads заменить все «/», как: (?<=\/\/).+.*(?=\/).*?

будет соответствовать только локальный: 27017 из вашего запроса

Здесь (?<=\/\/). сопрягает ни к чему после Строка «//» и (?=\/) соответствует чему-либо перед строкой «/»

Смежные вопросы