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.