【问题标题】:C# Distinguish between first and second matchC#区分第一场和第二场比赛
【发布时间】:2022-01-08 05:45:50
【问题描述】:

我正在使用正则表达式从包含范围的字符串中提取数字。范围可以是"less than x""greater than x""between x and y"

"10 - 22"
"< 0,5"
"3.50000 - 11.0"
"< 120000"  
"> 12"

下面是相关代码sn-p。对于"less than x""greater than x",我使用正则表达式(\d*,\d*)?(\d*) 来捕获整数/小数。

Low = r.Descr.Contains('>') 
    ? new Quantity {
        Value = Convert.ToDecimal(Regex.Match(r.Descr, @"(\d*,\d*)?(\d*)").Value)
    } 
    : r.Descr.Contains('-') 
    ? new Quantity {
        Value = Convert.ToDecimal(Regex.Match(r.Descr, @"").Value) 
    } 
    : null,
High = r.Descr.Contains('<') 
    ? new Quantity {
        Value = Convert.ToDecimal(Regex.Match(r.Descr, @"(\d*,\d*)?(\d*)").Value) 
    }
    : r.Descr.Contains('-') 
    ? new Quantity { 
        Value = Convert.ToDecimal(Regex.Match(r.Descr, @"").Value) 
    } 
    : null,

"between x and y" 的情况下,我在构建一个提取相关数字的正则表达式时遇到了困难。有没有办法对这三种模式使用正则表达式?

【问题讨论】:

  • 3,50000 - 11,0 是什么意思
  • var m = Regex.Match(text, @"(\d+(?:,\d+)?)\s*-\s*(\d+(?:,\d+)*)");,那么你就可以得到m.Groups[1].Valuem.Groups[2].Value的号码。
  • @GoldenLion 介于 3.5 和 11.0 之间。
  • 包含部分检查字符 ,但模式 (\d*,\d*)?(\d*) 也可以匹配空字符串或仅匹配逗号。使用\d+(?:,\d+)?,您将匹配至少一个数字。
  • 上面需要编辑的数据也反映了3.5 - 11.0

标签: c# regex


【解决方案1】:

你可以使用

var match = Regex.Match(text, @"(\d+(?:,\d+)?)\s*-\s*(\d+(?:,\d+)*)");

请参阅regex demo详情

  • (\d+(?:,\d+)?) - 捕获组 1:一位或多位数字后跟可选的逗号和一位或多位数字
  • \s*-\s* - - 用零个或多个空格字符括起来
  • (\d+(?:,\d+)*) - 捕获组 2:一位或多位数字后跟可选的逗号和一位或多位数字

现在,match 在第 0 组中包含一个 3,50000 - 11,0 子字符串,其余两组包含您的值:

if (match.Success)
{
    Console.WriteLine("{0} - first number", match.Groups[1].Value);
    Console.WriteLine("{0} - second number", match.Groups[2].Value);
}

C# demo

using System;
using System.Collections.Generic;
using System.Text.RegularExpressions;
 
public class Test
{
    public static void Main()
    {
        var text = "some words....3,50000 - 11,0 .... text....";
        var match = Regex.Match(text, @"(\d+(?:,\d+)?)\s*-\s*(\d+(?:,\d+)*)");
 
        if (match.Success)
        {
            Console.WriteLine("{0} - first number", match.Groups[1].Value);
            Console.WriteLine("{0} - second number", match.Groups[2].Value);
        }
    }
}

输出:

3,50000 - first number
11,0 - second number

【讨论】:

    【解决方案2】:

    试试这个表达式:

    (\d+,?\d+\s*-\s*\d+,?\d+)|(<\s*\d+,?\d+)|(>\s*\d+,?\d+)
    

    此表达式包含三个单独的表达式,由竖线字符 (|) 分隔。管道字符的意思是“或”。

    • 第一个表达式(\d+,?\d+\s*-\s*\d+,?\d+) 匹配每个由- 分隔的十进制数或不匹配。
    • 第二部分(&lt;\s*\d+,?\d+)匹配小于x的表达式,并且
    • 第三部分(&gt;\s*\d+,?\d+)匹配大于x的表达式。

    所以全局表达式提取了之间的情况,小于的情况,或大于的情况。因此,它似乎满足了所有搜索的案例。

    【讨论】:

      猜你喜欢
      • 2022-11-23
      • 1970-01-01
      • 1970-01-01
      • 2012-03-27
      • 2015-03-11
      • 1970-01-01
      • 2013-07-25
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多