C#在第一个空格之前替换所有内容

时间:2016-02-06 12:31:24

标签: c# regex replace

我需要在第一次出现空格之前删除字符串中的所有内容。

  1. 每个字符串都以数字开头,后跟空格
  2. 替换数字和空格,从而留下其余的字符串
  3. 例如:

      

    22印度的猫

         

    4殿下

         

    562吃土豆

         

    第二个冰箱里有42个饼干

         

    2564尼亚加拉大瀑布下午2点

    我只需要:

      

    印度的猫

         

    殿下

         

    吃土豆

         

    第二个冰箱里的饼干

         

    尼亚加拉大瀑布下午2点

    基本上删除第一个空格之前的每个数字,包括第一个空格。

    我试过了:

    foreach (string line in lines)
    {
           string newline = line.Trim().Remove(0, line.IndexOf(' ') + 1);
    }
    

    这适用于低于10的数字。在它达到2位数后,它无法正常工作。

    我应该如何更改我的代码?

5 个答案:

答案 0 :(得分:2)

如果您想确保只匹配字符串开头的数字,可以使用以下正则表达式:

^\d+\p{Zs}

请参阅demo

声明如下:

public static readonly Regex rx = new Regex(@"^\d+\p{Zs}", RegexOptions.Compiled);

^\d+\p{Zs}正则表达式表示:字符串开头的一个或多个数字后跟1个空格。

然后像

一样使用它
string newline = rx.Replace(line, string.Empty);

编辑:为了确保line没有前导空格,我们可以添加.Trim()来删除它:

Regex rx = new Regex(@"^\d+\p{Zs}", RegexOptions.Compiled);
string newline = rx.Replace(line.Trim(), string.Empty);

答案 1 :(得分:1)

另一种解决方案:

var lines = new string[]
    {
        "22 The cats of India",
        "4 Royal Highness",
        "562 Eating Potatoes",
        "42 Biscuits in the 2nd fridge",
        "2564 Niagara Falls at 2 PM"
    };

foreach (var line in lines)
{
    var newLine = string.Join(" ", line.Split(' ').Skip(1));
}

答案 2 :(得分:1)

我知道您已经找到了解决问题的方法。但我要解释为什么你的代码首先没有起作用。

Your Code

您的数据有额外的空格,这就是您修剪它的原因:line.Trim()。但真正的问题在于以下陈述:

string newline = line.Trim().Remove(0, line.IndexOf(' ') + 1);

您正在假设操作的顺序以及string数据类型不是immutable这一事实。当Trim()函数的操作完成时,它返回一个在Remove()操作中使用的全新字符串。但是IndexOf()函数是在原始数据行上完成的。

所以正确的代码行如下:

foreach (string line in lines)
{
    // trim the line first
    var temp = line.Trim();

    // now perform all operation on the new temporary string
    string newline = temp.Remove(0, temp.IndexOf(' ') + 1);

    // debugging purpose
    Console.WriteLine(newline);
}

答案 3 :(得分:0)

使用像这样的正则表达式:

string newline = Regex.Replace(line, @"^\s*\d+\s*", "");

这将仅删除数字,而不是第一个空格之前的其他文本。

答案 4 :(得分:-1)

这就是你要找的东西

foreach (string line in lines)
{
       string newline = line.Replace(line.Split(new Char[]{' '})[0] + ' ',string.Empty);
}

<强>更新

string search=line.Split(new Char[]{' '})[0];
int pos=line.indexOf(search);
string newline = line.Substring(0, pos) + string.Empty + line.Substring(pos + search.Length);

完整代码

using System;

public class Program
{
    public static void Main()
    {
        var lines = new string[]
        {
            "22 The cats of India",
            "4 Royal Highness",
            "562 Eating Potatoes",
            "42 Biscuits in the 2nd fridge",
            "2 Niagara Falls at 2 PM"
        };
        foreach(string line in lines){
            string search=line.Split(new Char[]{' '})[0];
            int pos=line.IndexOf(search);
            string newline = line.Substring(0, pos) + string.Empty + line.Substring(pos + search.Length);
            Console.WriteLine(newline);
        }
    }
}