我想在字符串中获取第一个数字实例。
所以我得到了这个输入字符串,可能是以下之一:
1: "Event: 1 - Some event"
2: "Event 12 -"
3: "Event: 123"
4: "Event: 12 - Some event 3"
输入字符串的输出必须为:
1: 1
2: 12
3: 123
4: 12
我尝试了以下方法,但它们都没有给我我想要的东西。
number = new String(input.ToCharArray().Where(c => Char.IsDigit(c)).ToArray());
//This gives me all the numbers in the string
var index = input.IndexOfAny("0123456789".ToCharArray());
string substring = input.Substring(index, 4);
number = new string(substring.TakeWhile(char.IsDigit).ToArray());
//This gives me first number and then the numbers in the next 4 characters. However it breaks if there is less than 4 characters after the first number.
编辑:很多人发布了很好的解决方案,但我最终接受了我在代码中实际使用的解决方案。我希望我能接受更多答案!
答案 0 :(得分:8)
使用Linq执行此操作的正确方法如下
number = new string(input.SkipWhile(c=>!char.IsDigit(c))
.TakeWhile(c=>char.IsDigit(c))
.ToArray());
基本上跳过不是数字的所有内容,然后在不再是数字时停止使用字符。请注意,这将停留在标点符号,因此它不会像" 30.5"一个字符串。如果你需要处理数字中的标点符号,那么正则表达式将是最佳选择。另请注意,您不需要执行ToCharArray
,因为字符串实现了IEnumerable<char>
,这是Linq所需的全部内容。
此外,您必须将.Net 4.0作为他们添加SkipWhile
和TakeWhile
扩展程序时的目标。
答案 1 :(得分:7)
在我看来,你只需要一个正则表达式:
using System;
using System.Text.RegularExpressions;
public class Test
{
static void Main()
{
ExtractFirstNumber("Event: 1 - Some event");
ExtractFirstNumber("Event: 12 -");
ExtractFirstNumber("Event: 123");
ExtractFirstNumber("Event: 12 - Some event 3");
ExtractFirstNumber("Event without a number");
}
private static readonly Regex regex = new Regex(@"\d+");
static void ExtractFirstNumber(string text)
{
var match = regex.Match(text);
Console.WriteLine(match.Success ? match.Value : "No match");
}
}
第一场比赛将仅从第一位开始,并将停在第一位非数字(或字符串的结尾)。如果需要,您可以使用匹配的Length
和Index
属性来计算字符串中的位置。
答案 2 :(得分:1)
see if this helps
var input = "sdmfnasldkfjhasdlfkjh234sdf234234";
var index = input.IndexOfAny("0123456789".ToCharArray());
string substring = input.Substring(index); // this will give rest of the string.
number = new string(substring.TakeWhile(char.IsDigit).ToArray());
//number will have 234
答案 3 :(得分:0)
使用正则表达式来获得结果。
有关正则表达式的详细信息,请参阅this。
String s1= "Event: 1 - Some event";
String s2= "Event 12 -";
String s3= "Event: 123";
String s4= "Event: 12 - Some event 3";
String result1 = System.Text.RegularExpressions.Regex.Match(s1, @"\d+").Value;
String result2 = System.Text.RegularExpressions.Regex.Match(s2, @"\d+").Value;
String result3 = System.Text.RegularExpressions.Regex.Match(s3, @"\d+").Value;
String result4 = System.Text.RegularExpressions.Regex.Match(s4, @"\d+").Value;