C# 如何使用正则表达式从字符串中提取特定值?

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应该使用\

我是Regex新手,我想从字符串中提取特定值,我有如下字符串:

"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