使用正则表达式替换只保留正斜杠和数字

时间:2014-12-08 12:16:12

标签: c# regex

我正在尝试使用正则表达式替换来改变它:

/category/45/p-e--sportswear/47/shorts-skorts

成:

/45/47/

除了数字之外,我可以删除所有数字,但我不确定如何在删除其他非字母数字字符的同时保留正斜杠。

urlReferrer = Regex.Replace(urlReferrer, @"[^\d]", string.Empty);

有人可以帮我找到正确的模式吗?

2 个答案:

答案 0 :(得分:2)

您可以使用:

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

RegEx Demo

答案 1 :(得分:0)

你可以这样做而不是正则表达式:

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 += "/";
}

这只是将字符串拆分为/,然后将数值与/一起作为分隔符连接起来。然后检查是否有任何数字,然后检查第一个是否为数字的最后一个值,以确定是否需要前一个和/或后一个/