C# 使用regex replace只保留正斜杠和数字

C# 使用regex replace只保留正斜杠和数字,c#,regex,C#,Regex,我正在尝试使用regex replace来更改以下内容: /category/45/p-e--sportswear/47/shorts-skorts 进入: 我可以去掉除数字以外的所有字符,但我不知道如何在删除其他非字母数字字符的同时保留正斜杠 urlReferrer = Regex.Replace(urlReferrer, @"[^\d]", string.Empty); 有人能帮我弄一下正确的图案吗?您可以使用: urlReferrer = Regex.Replace(urlReferr

我正在尝试使用regex replace来更改以下内容:

/category/45/p-e--sportswear/47/shorts-skorts
进入:

我可以去掉除数字以外的所有字符,但我不知道如何在删除其他非字母数字字符的同时保留正斜杠

urlReferrer = Regex.Replace(urlReferrer, @"[^\d]", string.Empty);
有人能帮我弄一下正确的图案吗?

您可以使用:

urlReferrer = Regex.Replace(urlReferrer, @"/[^/\d]+", string.Empty);
//=> /45/47

您可以这样做,而不是使用正则表达式:

StringBuilder builder = new StringBuilder();
bool first = true;
bool lastNumeric = true;
bool atLeastOneNumeric = false;
foreach (var part in urlReferrer.Split('/'))
{
    if (part.Length > 0 && part.All(char.IsDigit))
    {
        if (!first)
            builder.Append("/");
        builder.Append(part);
        lastNumeric = true;
        atLeastOneNumeric = true;
    }
    else
    {
        lastNumeric = false;
    }

    first = false;
}

if (!lastNumeric && atLeastOneNumeric)
    builder.Append("/");

urlReferrer = builder.ToString();
这是通过“/”停止字符串,然后检查哪些标记是数字标记,并将它们附加到结果中。此外,它会跟踪第一个标记是否为数字,然后在其前面不会出现“/”,或者如果最后一个标记为数字,则在其后面不会出现“/”。如果没有数值,它还确保不包含任何“/”

下面是一个使用
string.Join
和Linq的较短版本

var tokens = urlReferrer.Split('/');

urlReferrer = string.Join("/", tokens.Where(s => s.Length > 0 && s.All(char.IsDigit)));

if(urlReferrer.Length > 0)
{
    if (tokens.First().Length == 0 || !tokens.First().All(char.IsDigit))
        urlReferrer = "/" + urlReferrer;

    if (tokens.Last().Length == 0 || !tokens.Last().All(char.IsDigit))
        urlReferrer += "/";
}

这只需将字符串拆分为
/
,然后将数值与
/
合并作为分隔符。然后,在检查前一个值是否为最后一个值之前,它会检查是否有任何数字,以确定是否需要前面和/或后面的
/

为什么您不想将
//45//47///code>作为输出?使用
[^\/\d]+
regex并用空字符串替换所有匹配的字符。但是它给出了OP希望输出为
/45/47/
/45/47/
。这缺少尾随的
/
var tokens = urlReferrer.Split('/');

urlReferrer = string.Join("/", tokens.Where(s => s.Length > 0 && s.All(char.IsDigit)));

if(urlReferrer.Length > 0)
{
    if (tokens.First().Length == 0 || !tokens.First().All(char.IsDigit))
        urlReferrer = "/" + urlReferrer;

    if (tokens.Last().Length == 0 || !tokens.Last().All(char.IsDigit))
        urlReferrer += "/";
}