Regex заменить помощь - PullRequest
       14

Regex заменить помощь

2 голосов
/ 27 января 2009

Используя .NET Framework, я пытаюсь заменить символы двойной косой черты в строке одной косой чертой, но, похоже, удаляется лишний символ, и я не знаю почему.

У меня есть строка:

http://localhost:4170/RCRSelfRegistration//Default.aspx

Мое регулярное выражение:

[^(://|:\\\\)](\\\\|//|\\/|/\\)

И возвращаемое значение:

http://localhost:4170/RCRSelfRegistratio/Default.aspx

Вы видите, что n в RCRSelfRegistration было удалено. Я не уверен почему.

/// <summary>
/// Match on double slashes (//, \\, /\, \/) but do not match :// or :\\
/// </summary>
private const string strMATCH = @"[^(://|:\\\\)](\\\\|//|\\/|/\\)";

/// <summary>
/// Replace double slashes with single slash
/// </summary>
/// <param name="strUrl"></param>
/// <returns></returns>
public static string GetUrl(string strUrl)
{
    string strNewUrl
    System.Text.RegularExpressions.Regex rxReplace =
      new System.Text.RegularExpressions.Regex(strMATCH);

    strNewUrl = rxReplace.Replace(strUrl, "/");

    return strNewUrl;
}

Ответы [ 6 ]

5 голосов
/ 27 января 2009

[^(://|:\\\\)] не работает так, как вы думаете.

[] - это диапазон символов - он соответствует одному символу, который содержится в диапазоне.

[^:] будет соответствовать любому символу, кроме двоеточия. Это может быть ближе к тому, что вы хотите.

То, что вы, вероятно, действительно хотите, это утверждение нулевой ширины за утверждением : (?<!:)

4 голосов
/ 27 января 2009

Первая часть вашего регулярного выражения "[^ (: // |: \\)]" соответствует любому символу, который не является "(: / | \" (как указывает томалак, отрицание соответствует всем символам внутри него) (без дополнительной логики обработки), которая включает «n» непосредственно перед «//default.aspx» - это не утверждение нулевой ширины.

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

2 голосов
/ 27 января 2009

Вам нужен отрицательный взгляд на группу, подобную этой:

(?<!:)(\\\\|//|\\/|/\\)
1 голос
/ 27 января 2009

Вы пытались использовать метод замены строки. Это не так элегантно, как regex replace, но если вы не делаете это на огромных строках сотни раз в цикле, это должно служить вашей цели:

string myString = oldString.Replace(@"\\", @"\").Replace("//", "/");

В противном случае вы можете потратить в возрасте от fidlign с Regex.

1 голос
/ 27 января 2009

Часть отрицания [^ (: // |: \\)] вашего регулярного выражения соответствует n и таким образом удаляет его.

0 голосов
/ 27 января 2009

Я думаю, вам просто нужно заменить строку на цикл. Замените все "//" на "/". Вам нужна функция, которая сохраняет позицию поиска и позволяет вам пройти через строку. Как только вы достигли конца строки, сделайте это снова, пока вы не сделаете замен на пасе.

например:

/// A // а / а ////

проход 1

// а / а / а //

проход 2

/ а / а / а /

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...