首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >在C#.NET中修剪具有特定模式的字符串值

问在C#.NET中修剪具有特定模式的字符串值
EN

Stack Overflow用户
提问于 2018-06-18 09:10:23
回答 1查看 221关注 0票数 5

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

数字:某样东西,什么东西,什么东西

例如字符串:

23:价值,14:重新估价,再订购

要求是,每当它跨越超过1000个字符,我必须删除前500个字符。如果不以数字开头,则必须删除字符,直到到达第一个字符为数字的位置为止。

代码语言:javascript
复制
sortinfo = sortinfo.Remove(0, 500);
sortinfo = new string(sortinfo.SkipWhile(c => !char.IsDigit(c)).ToArray());

我能够在上面的代码帮助下做到这一点。

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

14:重新估价,再订购

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

23:value,或3 dernew14:value,orderagain

并删除5个字符,输出为

3dernew14:再一次,再一次

而要求是

14:重新估价,再订购

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

我的完整代码

代码语言:javascript
复制
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;
    }
}
EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2018-06-18 09:23:10

使用正则表达式:

代码语言:javascript
复制
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;
}

请注意,这里有一个很大的风险:您可以削减“在中间”的数字。

因此,您可以将“xxxxxxxxxxxxx24: trim”裁剪为“4:trim”。

regex的意思是:查找数字序列0-9 (至少一个数字) ([0-9]+),然后是一个:,然后是所有其他字符(.*)。在此序列之前,可以有任何其他字符,但只有最小数量可能的(?<=.*?)。这个预序列没有捕获(?<=...)。

最后,regex可以简化为:

代码语言:javascript
复制
static Regex rx = new Regex("[0-9]+:.*");

因为它是未锚定的,所以比赛将在比赛的第一次出现时开始。

要解决这个问题:

代码语言:javascript
复制
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;
}

我们有点作弊。要修剪15个字符,我们跳过14个字符(trimLength - 1),然后捕获一个非数字字符(我们将忽略(?:[^0-9]))加上数字和:以及其他([0-9]+:.*)。注意Groups[1].Value的使用

票数 4
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/50906060

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档