regex.replace不能用“$”模式工作 - c#

时间:2015-12-23 12:57:19

标签: c# regex

我尝试使用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;

我怀疑问题出在“$”上。还有其他方法可以克服它吗? 谢谢!

2 个答案:

答案 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, "://" + "*****");