使用.NET框架,我试图用一个斜杠替换字符串中的双斜杠字符,但它似乎是删除了一个额外的字符,我不知道为什么。
我有一个字符串:
http://localhost:4170/RCRSelfRegistration//Default.aspx
我的正则表达式是:
[^(://|:\\\\)](\\\\|//|\\/|/\\)
返回值为:
http://localhost:4170/RCRSelfRegistratio/Default.aspx
您可以看到RCRSelfRegistration中的n已被删除。我不知道为什么。
/// <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;
}
答案 0 :(得分:5)
[^(://|:\\\\)]
无法按照您的想法运作。
[]
是一个字符范围 - 它匹配范围中包含的单个字符。
[^:]
将匹配冒号以外的任何字符。这可能更接近你想要的。
您可能真正需要的是zero-width lookbehind assertion:(?<!:)
答案 1 :(得分:4)
你的正则表达式的第一部分“[^(:// |:\\)]”匹配任何不是“(:/ | \”的字符(正如tomala指出的那样,negset匹配其中的所有字符) ,没有进一步处理逻辑),其中包括紧跟在“//default.aspx”之前的“n” - 它不是零宽度断言。
您可能想要做的是将模式的这一部分更改为零宽度lookbehind,以确保斜杠字符前面没有冒号。
答案 2 :(得分:2)
你需要的是像这样的群体背后的负面看法:
(?<!:)(\\\\|//|\\/|/\\)
答案 3 :(得分:1)
正则表达式的否定部分[^(:// |:\\)]与n匹配,从而将其删除。
答案 4 :(得分:1)
您是否尝试过使用string的replace方法?它并不像正则表达式那样优雅,但只要你在循环中没有在巨大的字符串上做数百次就应该达到你的目的:
string myString = oldString.Replace(@"\\", @"\").Replace("//", "/");
否则你可以和Regex一起度过年迈的fidlign。
答案 5 :(得分:0)
我认为你只需要一个简单的字符串替换循环。将所有“//”替换为“/”。您需要一个保存搜索位置的功能,并让您遍历字符串。一旦你到达字符串的末尾再次执行,直到你没有对传递进行任何替换。
例如:
///一个// A / A ////
传递1
// A / A / A //
传递2
/ A / A / A /