我尝试使用Regex.replace()
替换Git网址中的用户名。
我想使用Regex.Replace
代替string.Replace
的原因是因为我只想替换第一次出现。
预期结果为:"https://******:adss!#&@github.com/test/test.git"
实际结果是:"https://#32$3:adss!#&@github.com/test/test.git"
不幸的是它没有被替换。代码如下:
class Program
{
private static Regex reg = new Regex(@"(?i)(http|https):\/\/(?<UserName>.*):(.*?)@.*\/");
private const string userNameGroup = "UserName";
static void Main(string[] args)
{
string url = matchRgexWithUserName("https://#32$3:adss!#&@github.com/test/test.git");
Console.WriteLine(url);
}
static string matchRgexWithUserName(string url)
{
Match match = reg.Match(url.ToString());
string username = match.Groups[userNameGroup].Value;
Regex r = new Regex(username);
url = r.Replace(url,"******",1);
return url;
}
}
这条线运作良好:
string username = match.Groups[userNameGroup].Value;
问题出在这些方面:
Regex r = new Regex(username);
url = r.Replace(url,"******",1);
return url;
我怀疑问题出在“$”上。还有其他方法可以克服它吗? 谢谢!
答案 0 :(得分:1)
它不起作用,因为$
是正则表达式中的特殊字符。
要解决此问题,您可以将所有内容放在UserName
之前,然后放入组中:
Regex reg = new Regex(@"(?<firstPart>(?i)(http|https):\/\/)(?<UserName>.*)(?<secondPart>:(.*?)@.*\/)");
然后,您可以使用Replace
合并firstPart
,"******"
和secondPart
- 不UserName
:
string result = reg.Replace(url, "${firstPart}******${secondPart}");
基本上,您将网址与{firstPart}{UserName}{secondPart}
模式匹配,并将其替换为{firstPart}******{secondPart}
(删除UserName
)。
答案 1 :(得分:0)
以这种方式使用Regex.Replace
是错误的方法。一旦知道用户名,就可以使用常规字符串替换:
url = url.Replace("://" + username, "://" + "*****");