简体   繁体   中英

C# Distinguish between first and second match

I am using regex to extract the numbers from a string which contains a range. The range could be "less than x" , "greater than x" or "between x and y" :

"10 - 22"
"< 0,5"
"3,50000 - 11,0"
"< 120000"  
"> 12"

Below is the relevant code snippet. In the case of "less than x" and "greater than x" I use the RegEx (\d*,\d*)?(\d*) to capture the integer/decimal.

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,

In the case of "between x and y" I am having difficulties in constructing a RegEx which would extract the relevant number. Is there a way to do this using RegEx?

try this expression:

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

You can use

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

See the regex demo . Details :

  • (\d+(?:,\d+)?) - Capturing group 1: one or more digits followed with an optional occurrence of a comma and one or more digits
  • \s*-\s* - a - enclosed with zero or more whitespace chars
  • (\d+(?:,\d+)*) - Capturing group 2: one or more digits followed with an optional occurrence of a comma and one or more digits

Now, match contains a 3,50000 - 11,0 substring in Group 0, and the rest two groups contain your values:

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

See the 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);
        }
    }
}

Output:

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

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM