【问题标题】:Trim String value with particular pattern in C#.NET在 C#.NET 中使用特定模式修剪字符串值
【发布时间】:2018-06-18 09:10:23
【问题描述】:

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

"数字:某事,某字符串编号:某事,某字符串"

等示例字符串:

"23:value,ordernew14:valueagain,orderagain"

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

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

我可以在上面的代码的帮助下做到这一点

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

14:valueagain,orderagain

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

23:value,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;
    }
}

【问题讨论】:

  • 您是否尝试过上述解决方案的正则表达式?
  • 你想去下一个“模式”...但是你的模式很差,因为你没有真正的记录之间的分隔符......所以现在你有问题了。
  • 号码总是这样14:吗?如果是,您可以匹配14: 等模式的数字,否则继续
  • 是的,问题模式很差,因此面临问题,无法改变模式,它存在多年,很多东西都依赖于它,改变它会破坏很多东西。必须以相同的模式工作:(
  • 我想他的意思是如果它总是跟着:。从那时起,您可以使用\d+: 之类的正则表达式来匹配您的开始

标签: c# regex string linq


【解决方案1】:

使用正则表达式:

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;
}

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

因此您可以将“xxxxxxxxxxxxxx24:something”修剪为“4:something”。

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

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

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

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

解决这个问题:

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的使用

【讨论】:

  • 要解决最后一点,首先删除 499 个字符并确保至少删除 1 个非数字。
  • @bommelding 如果你要删除一个数字,你会怎么做?您需要跳过两次...
  • 是的,如果您点击了一个数字,那么您首先必须跳过该数字和所有其他数字以及 :(如果存在)。从那时起应用你的正则表达式。
  • @bommelding 更改了正则表达式...这比我想象的要容易。
  • @Prashant 上一版代码解决了这个问题
猜你喜欢
  • 1970-01-01
  • 2014-11-27
  • 2018-11-23
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-07-25
相关资源
最近更新 更多