我需要在第一次出现空格之前删除字符串中的所有内容。
例如:
22印度的猫
4殿下
562吃土豆
第二个冰箱里有42个饼干
2564尼亚加拉大瀑布下午2点
我只需要:
印度的猫
殿下
吃土豆
第二个冰箱里的饼干
尼亚加拉大瀑布下午2点
基本上删除第一个空格之前的每个数字,包括第一个空格。
我试过了:
foreach (string line in lines)
{
string newline = line.Trim().Remove(0, line.IndexOf(' ') + 1);
}
这适用于低于10的数字。在它达到2位数后,它无法正常工作。
我应该如何更改我的代码?
答案 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)
我知道您已经找到了解决问题的方法。但我要解释为什么你的代码首先没有起作用。
您的数据有额外的空格,这就是您修剪它的原因: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);
}
}
}