在C#.NET中使用特定模式修剪字符串值

时间:2018-06-18 09:10:24

标签: c# regex string linq

我有一个长度为900-1000个字符的字符串。 模式字符串如下是

  

"数:东西,somestringNumber:东西,somestring"

等示例字符串:

  

" 23:值,ordernew14:valueagain,orderagain"

要求是每当超过1000个字符时,我必须删除前500个字符。然后,如果不以Number开头,我必须删除字符,直到我到达第一个字符为数字的点

sortinfo = sortinfo.Remove(0, 500);
sortinfo = new string(sortinfo.SkipWhile(c => !char.IsDigit(c)).ToArray());

我可以借助上面的代码

来做到这一点

在上面的例子中,如果我给删除5个字符输出将是

  

14:valueagain,orderagain

这很好。 但如果字符串有值:

  

23:值,or3dernew14:valueagain,orderagain

并删除5个字符,输出为

  

3dernew14:valueagain,orderagain

并且要求是

  

14:valueagain,orderagain

因此它打破了一切,因为它的格式不正确。 请帮帮我怎么做呢

我的完整代码

class Program
{
    static void Main(string[] args)
    {
        string str;
        str=TrimSortInfo("23:value,ord4er24:valueag4ain,order6again15:value,order"); // breaking value
        //str = TrimSortInfo("23:value,order24:valueagain,orderagain15:value,order"); //working value
        Console.WriteLine(str);
        Console.ReadLine();

    }

    static string TrimSortInfo(string sortinfo)
    {
        if (sortinfo.Length > 15)
        {
            sortinfo = sortinfo.Remove(0, 15);
            sortinfo = new string(sortinfo.SkipWhile(c => !char.IsDigit(c))
                         .ToArray());
            return sortinfo;
        }
        return sortinfo;
    }
}

1 个答案:

答案 0 :(得分:4)

使用正则表达式:

static Regex rx = new Regex("(?<=.*?)[0-9]+:.*");

static string TrimSortInfo(string sortinfo, int trimLength = 15)
{
    if (sortinfo.Length > trimLength)
    {
        return rx.Match(sortinfo, trimLength).Value;
    }
    return sortinfo;
}

请注意,这里存在很大的风险:你可以在中间修剪&#34;&#34;数字。

所以你可以修剪一个&#34; xxxxxxxxxxxxxx24:某事&#34;到&#34; 4:某事&#34;。

正则表达式意味着:查找数字序列0-9(至少一位数)([0-9]+),然后是:,后跟所有其他字符({{1} })。在此序列之前,可以有任何其他字符,但只有可能的最小数量.*。此序列未被捕获(?<=.*?)

最后,正则表达式可以简化为:

(?<=...)

因为它是未锚定的,所以匹配将在第一次匹配时开始。

解决这个问题:

static Regex rx = new Regex("[0-9]+:.*");
我们作弊了一点。为了修剪15个字符,我们跳过14个字符(static Regex rx = new Regex("(?:[^0-9])([0-9]+:.*)"); static string TrimSortInfo(string sortinfo, int trimLength = 15) { if (sortinfo.Length > trimLength) { return rx.Match(sortinfo, trimLength - 1).Groups[1].Value; } return sortinfo; } )然后我们捕获一个非数字字符(我们将忽略trimLength - 1)加上数字和:以及其他所有(?:[^0-9])。请注意使用([0-9]+:.*)