C# 如何使用正则表达式从一串数字中提取中间数

C# 如何使用正则表达式从一串数字中提取中间数,c#,regex,C#,Regex,我有一个数据字段,其中包含两种格式的大量数字: 553000.468...705.46.0000000 <- Format 1 553000.469.5501000.704.47.0000000 <- Format 2 553000.468…705.46.0000000 我只需要中间的三个数字,包括703, 704个或705个/p> 您可以使用以下选项: @"\.(70[3-5])\." 如果这些是唯一有效的值 顺便问一下,谁说regex是解决问题的最佳方法?使用

我有一个数据字段,其中包含两种格式的大量数字:

553000.468...705.46.0000000        <- Format 1
553000.469.5501000.704.47.0000000  <- Format 2
553000.468…705.46.0000000
<>我只需要中间的三个数字,包括703, 704个或705个/p>
您可以使用以下选项:

@"\.(70[3-5])\."
如果这些是唯一有效的值


顺便问一下,谁说
regex
是解决问题的最佳方法?
使用
上的方法?然后你可以得到你想要的数字,如果它总是有相同的位置,或者你可以在数组中循环找到你想要的数字。

分两步做怎么样。首先,找出中间有三位数字的两个句点。然后,修剪周期

Regex num = new Regex(@"\.\d{3}\.");
Match number = num.Match(numb);
if (number.Success)
    Console.WriteLine(number.Value.Trim('.')); 
您还可以捕获匹配的子集:

Regex num = new Regex(@"\.(\d{3})\.");
Match number = num.Match(numb);
if (number.Success)
    Console.WriteLine(number.Groups[1].Value); 

这个。是正则表达式的元字符,因此需要对其进行转义。以7开头的数字总是3位数吗

您可以尝试以下操作:

   Regex num = new Regex(@"(?\.<number>\d+) ?");
   Match number = num.Match(numb);
   if (number.Success)
        Console.WriteLine(num.Match(numb).Result("${number}")); 
Regex num=newregex(@“(?\。\d+);
匹配编号=num.Match(numb);
如果(数字成功)
WriteLine(num.Match(numb.Result(${number}));

您需要将句点转义为
\。
,因为
在正则表达式中表示“任何字符”

您可以在所需数字之前匹配特定数字的可选数字+句点:

Regex num = new Regex(@"^(?:\d*\.){3}(?<number>\d+)");
Regex num=newregex(@“^(?:\d*\){3}(?\d+);
或之后:

Regex num = new Regex(@"(?<number>\d+)(?:\.\d*){2}$");
Regex num=newregex(@“(?\d+(:\。\d*){2}$”;

使用
String.Contains
测试这三种情况。假设字符串是变量
s

s.Contains(".705.")
s.Contains(".706.")
s.Contains(".707.")

如果你厌倦了正则表达式

    string[] formats = new[] {"553000.468...705.46.0000000", "553000.469.5501000.704.47.0000000"};
    var results = from format in formats
                  from sub in format.Split('.')
                  where new[] { "703","704","705" }.Contains(sub)
                  select sub;

我不知道你说的“中间数字”是什么意思。你能详细说明你希望匹配什么吗?顺便说一句,谁说
regex
是解决你问题的最好方法?@gdoron我更愿意使用Substring()方法,但这是我老板想做的,因为我只是一名实习生,所以我只说是的,先生。:)@编程新手——作为一名开发人员,你的工作就是告诉你的老板有更好/更简单的方法来解决问题。过度复杂化代码不是一个好的教训。你为什么不给他带来多种解决方案(
Regex()
Substring()
Split()
)看看他有什么要说的?你甚至可以进行一些性能测试,并将结果展示给你的老板,推荐您认为是处理此问题的最佳方法。@gdoron这将一直有效,直到它遇到一个数字,该数字包含在我需要它们的位置之前,这是可能的。例如,553703.468…705.46.0000000在实际需要时会给我703705@ProgrammingNewbie. 你应该给出更多的例子来说明你需要什么。然后你可以做\.70[\d]\。这将保证在700和709之间只有3位数字,在
之前和之后都有一个句号“\。”
可能是better@AustinSalonen. 将它与另一个家伙的建议一起使用,谢谢。+1--问题似乎是OP要么想要两个值(703和705包括在内)之间的#,要么想要列表中的第n个值。向前看和向后看在这方面太过分了,会影响性能。@BenVoigt:没有向前看或向后看。
(?在那个位置没有,但703、704和705是我唯一需要的。刚刚看到你的更新,所以这不会有多大帮助!
s.Contains(".705.")
s.Contains(".706.")
s.Contains(".707.")
    string[] formats = new[] {"553000.468...705.46.0000000", "553000.469.5501000.704.47.0000000"};
    var results = from format in formats
                  from sub in format.Split('.')
                  where new[] { "703","704","705" }.Contains(sub)
                  select sub;