Java Reguar Expression: Как заменить двойную или более косую черту одной косой чертой, но игнорируя http: // или https: // - PullRequest
1 голос
/ 13 апреля 2019

Текущий код для удаления нескольких слешей

path = path.replaceAll("/{2,}", "/");

, который превращает https://stackoverflow.com в https: /stackoverflow.com, а это не предназначено.

Я сделал несколькоисследовать и придумать отрицательный взгляд за спиной, чтобы игнорировать двойные слэши, у которых раньше было https:, но это соответствует только двойным слэшам , а не тройным слешам или более:

(?<!http\/\/)

Я подумал, что еслиВы можете отрицать регулярное выражение 'sub', оно может быть примерно таким, означая совпадения ( двойная или более косых черт ), но не совпадение с двумя косыми чертами, которые имеют https: вперед.

\/{2,}.negate(https:(?=\/\/))

Возможно ли это?

Ответы [ 2 ]

1 голос
/ 13 апреля 2019

У вас была правильная идея с негативным взглядом сзади, но вы не должны включать сами косые черты в взгляд сзади.Вы хотите сопоставить несколько слэшей во всех случаях, но отрицательный взгляд сзади говорит: «игнорируйте это, если предыдущий текст http:. Поэтому было бы что-то вроде

(?<!http:)/{2,}

, чтобы найти все слэши, которые вы хотитезаменить. Вы, конечно, можете включить другие протоколы, такие как https: и ftp:, примерно так:

(?<!(http:|https:|ftp:))/{2,}
0 голосов
/ 13 апреля 2019

Вот мое окончательное решение в Java:

String path = "http:///baidu.com///a//b/c";
path = path.replaceFirst("(?=(http:|https:|ftp:))/{3,}", "/{2}");
path = path.replaceAll("(?<!(http:|https:|ftp:))/{2,}", "/");

Вторая строка заменяет первые 3 или более косых черт за протоколом двойными косыми чертами. Я использовал позитивный взгляд назад (?<=...).

Третья строка заменяет остальные двойные или более слешей и заменяет их одиночными слешами. Я использовал отрицательный взгляд назад (?<!...)

...