C# 如何使用正则表达式从字符串中提取特定值?
我是Regex新手,我想从字符串中提取特定值,我有如下字符串:C# 如何使用正则表达式从字符串中提取特定值?,c#,regex,string,visual-studio,C#,Regex,String,Visual Studio,我是Regex新手,我想从字符串中提取特定值,我有如下字符串: "20098: Blue Quest" "95: Internal Comp" "33: ICE" 以此类推。每个字符串都有相同的模式:数字后跟“:”后跟空格和随机文本。我想在开始时获得例如:“20098”、“95”、“33”等的数字。 我试过了 Regex ex = new regex(@"[0-9]+\: [a-zA-Z]$") 这并没有给我任何解决方案,我哪里做错了? (我使用的是c#)首先,在冒号之后,yoiu应该使用\
"20098: Blue Quest"
"95: Internal Comp"
"33: ICE"
以此类推。每个字符串都有相同的模式:数字后跟“:”后跟空格和随机文本。我想在开始时获得例如:“20098”、“95”、“33”等的数字。
我试过了
Regex ex = new regex(@"[0-9]+\: [a-zA-Z]$")
这并没有给我任何解决方案,我哪里做错了?
(我使用的是c#)首先,在冒号之后,yoiu应该使用\s而不是文字空间。此外,如果冒号后面的文本可以包含空格,则第二个组还应允许/s并在其后面加一个+
[0-9]+\:\s[a-zA-Z\s]+$
其次,整个正则表达式将返回整个字符串。如果您只需要第一个数字,那么正则表达式将是:
[0-9]+
如果它们都是单独的字符串,您可以使用look-behind
?——您不需要使用正则表达式,只需使用:
var s = "20098: Blue Quest";
var index = s.IndexOf(':');
if(index > 0){
if(int.TryParse(s.Substring(0, index), out var number))
{
// Do stuff
}
}
如果它们都包含在一个sting中,您可以在每一行上循环并执行子字符串
。可能更容易阅读,因为很多人不习惯使用正则表达式。在正则表达式中,[0-9]+:[a-zA-Z]$
匹配一个或多个数字,后跟冒号,然后是单个小写或大写字符。
这将匹配20098:B
,并且不会仅匹配数字
除了像建议的那样使用正则表达式之外,还有更好的替代方法,但是您可以从字符串的开头匹配一个或多个数字\d+
,并使用正向前瞻(?=
断言后面是冒号、空格和大写字符[a-Z])
这是一个完全愚蠢的解决方案。然而,我决定对照答案中的其他正则表达式和int解析解决方案,对未经检查的指针版本进行基准测试 您提到字符串总是采用相同的格式,所以我决定看看我们能以多快的速度得到它 Yehaa
public unsafe static int? FindInt(string val)
{
var result = 0;
fixed (char* p = val)
{
for (var i = 0; i < val.Length; i++)
{
if (*p == ':')return result;
result = result * 10 + *p - 48;
}
return null;
}
}
不足为奇的是,正则表达式糟糕透顶你能详细说明你所说的“这没有给我任何解决方案”是什么意思吗"? 您只展示了正则表达式的声明,没有展示它的任何用法。A会使帮助你更容易。请注意,当前正则表达式只允许在数字和冒号之后使用单个字符。。。另外请注意,如果要从正则表达式中提取值,可能需要查看捕获组。如果字符串始终采用这种格式,则不需要正则表达式,可以使用
s.Split(“:”).FirstOrDefault()
谢谢这很容易理解!另一方面,它不会验证文本是否为预期格式-在某些不正确的情况下(例如“foo:bar”),它会自动返回字符串,如果没有冒号,则会引发异常。使用正则表达式,很容易表达您希望文本遵循的模式,检查它是否这样做,然后提取您想要的部分。我添加了一些基本的checkscept,它允许负数(我们不知道它们是否有效),并要求数字在int
范围内。(它也不会检查冒号后面是否有空格。)我们不知道这些假设是否有效。。。当您添加这些检查时,它与正则表达式版本一样冗长,但不够精确。虽然我同意有时正则表达式不是最合适的方法,但从我们目前为止在这个问题上获得的信息来看,我会使用正则表达式。但是在冒号后面的文本中可能有数字,正则表达式是[0-9]+\:?因为我想在冒号之前输入数字,如果他们只想输入开头的数字,那么他们应该用^
锚定它。我认为双引号表示它们是字符串文本,实际上不是正在处理的字符串的一部分。哇,这太棒了-我喜欢它!了解性能是否曾经是一个问题的简便方法。
Test Framework : .NET Framework 4.7.1
Scale : 100000
Name | Time | Delta | Deviation | Cycles
----------------------------------------------------------------------------
Pointers | 2.597 ms | 0.144 ms | 0.19 | 8,836,015
Int.Parse | 17.111 ms | 1.009 ms | 2.91 | 57,167,918
Regex ^\d+ | 85.564 ms | 10.957 ms | 6.14 | 290,724,120
Regex ^\d+(?=: [A-Z]) | 98.912 ms | 1.508 ms | 7.16 | 336,716,453
Scale : 1000000
Name | Time | Delta | Deviation | Cycles
-------------------------------------------------------------------------------
Pointers | 25.968 ms | 1.150 ms | 1.15 | 88,395,856
Int.Parse | 143.382 ms | 2.536 ms | 2.62 | 487,929,382
Regex ^\d+ | 847.109 ms | 14.375 ms | 21.92 | 2,880,964,856
Regex ^\d+(?=: [A-Z]) | 950.591 ms | 6.281 ms | 20.38 | 3,235,489,411