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

3

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

  1. 每个字符串以数字开头并跟随一个空格
  2. 替换数字和空格,从而保留其余字符串不变

例如:

22 印度的猫

4 皇家殿下

562 吃土豆

42 第2个冰箱里的饼干

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

我只需要:

印度的猫

皇家殿下

吃土豆

第2个冰箱里的饼干

下午2点的尼亚加拉瀑布

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

我试过这个:

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

这个方法适用于小于10的数字。当数字超过2位数时,它不能正常工作。

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


2
地球人,许多人已经回答了你最初的问题。你现在又提出了一个额外的问题。这不是 SO 的工作方式。如果你有另一个问题,请开一个新的提问。 - Matt Rowland
不要忘记给那些有帮助的人点赞。 - Wiktor Stribiżew
如果输入已知为该格式,则在此情况下使用正则表达式是过度的,我的看法是:string.Concat(str.TrimStart().SkipWhile(char.IsNumber).Skip(1))。问问自己,每次更改此代码时,您是否想要Google \p{Zs}的含义... - Laoujin
5个回答

2

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

^\d+\p{Zs}

请查看演示

声明方式如下:

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

^\d+\p{Zs}正则表达式的意思是:字符串开头有一个或多个数字,后面跟着一个空格。

然后可以像这样使用:

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

这解决了!非常感谢!我还添加了一点改动。我加了 line.Trim() 使它能够工作。谢谢啊! - Jay
啊哈,如果你只需要删除前导空格,仍然可以使用^\p{Zs}*\d+\p{Zs},但是如果你仍然需要从line的末尾修剪空格,你真的可以利用Trim() - Wiktor Stribiżew

2
我知道您已经找到了解决问题的办法。但我将解释为什么您的代码一开始没有起作用。

Your Code

您的数据存在额外的空格,因此您正在修剪它:line.Trim()。但真正的问题在于以下语句:
string newline = line.Trim().Remove(0, line.IndexOf(' ') + 1);

您正在做出关于操作顺序和字符串数据类型不是不可变的假设。当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);
}

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

1
是的,它会,但问题是关于特定输入的 :) “每个字符串以数字开头,后跟一个空格” - Szabolcs Dézsi
1
一个人在本地化行业工作时,不能对输入质量过于确定。 :) - Wiktor Stribiżew
1
我完全同意你的看法 :) - Szabolcs Dézsi

0
使用正则表达式如下:
string newline = Regex.Replace(line, @"^\s*\d+\s*", "");

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


编辑:如果我需要第一个空格后面的所有数字,我需要替换数字和第一个空格。 - Jay
@地球人 为什么不试试提供的回答呢?我的正则表达式锚定在字符串的开头,所以它只会匹配开头的数字! - Lucero
它还会匹配字符串开头的空格,并且也会匹配数字后面没有空格的情况。 - Wiktor Stribiżew
@WiktorStribiżew 是的,我认为这是有意为之的行为,因为原始示例中有一个 Trim() 调用。此外,“第一个空格之前的任何数字”在没有空格的情况下并没有明确定义;我假设“任何数字”是关键部分,并且结果字符串应该是左修剪的。 - Lucero

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

不确定但似乎这段代码无法编译,难以理解,如果字符串中稍后出现了数字的第二次出现,它也将被清除。 - Lucero
这段代码运行良好,我已经更新了代码。split被替换为Split。在fiddle上它能够正常工作。 - Hemal
3
如果你有“1 Banana 1 Fruit”这个字符串,结果将会是“Banana Fruit”,而不是OP所要求的“Banana 1 Fruit”。请注意保持原意,简化表达,不添加解释或其他内容。 - Lucero
@Lucero @Earthling 我已经更新了我的代码并添加了完整的代码,现在它可以正常运行。1 Banana 1 Fruit 将被转换为 Banana 1 Fruit - Hemal
除了非常低效之外,它仍然会删除第一个空格之前的任何内容,而不仅仅是数字。此外,还有一些边缘情况并不真正起作用-请参见https://dotnetfiddle.net/JTUvRF ;) - Lucero

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接