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

Posted

技术标签:

【中文标题】使用正则表达式替换仅保留正斜杠和数字【英文标题】:keep only forward slashes and numbers with regex replace 【发布时间】:2015-02-06 02:21:15 【问题描述】:

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

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

进入:

/45/47/

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

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

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

【问题讨论】:

为什么你不想得到//45//47/ 作为输出?使用[^\/\d]+ 正则表达式并将所有匹配的字符替换为空字符串。但它给了//45//47/ 【参考方案1】:

你可以使用:

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

RegEx Demo

【讨论】:

OP 希望输出为/45/47/。这缺少尾随 /【参考方案2】:

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

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

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

【讨论】:

以上是关于使用正则表达式替换仅保留正斜杠和数字的主要内容,如果未能解决你的问题,请参考以下文章

在 presto 中使用正则表达式仅在最后一个斜杠前面有一个字符时才删除它

使用“new RegExp”和使用正斜杠符号创建正则表达式有啥区别?

包含正斜杠的 Django URL 正则表达式

oracle regexp_replace 保留数字和反斜杠

正则表达式使用 postgres regexp_replace() 用单引号替换反斜杠和单引号

斜线前数字的正则表达式