使用正则表达式

时间:2015-05-28 13:07:53

标签: c# regex

我试图创建一个从给定字符串输入中提取大于125的字符串的表达式。

var input = "YH300s, H900H, 234, 90.5, +12D, 48E, R180S, 190A, 350A, J380S";

请查看链接以获取对我的脚本/数据示例的进一步参考。

DonotFiddle_Regex example

这是我当前的表达式尝试(*):

Regex.Matches(input,@"(?!.*\..*)[^\s\,]*([2-5][\d]{2,})[^\s\,]*"))

从上面的表达式中,唯一的输出是350A, J380S

但是我想从输入字符串中提取以下输出(请参阅上面的链接以获得进一步的参考):

YH300s, H900H, R180S, 190A, 350A, J380S

对于我可能出错的地方的任何进一步指导将非常感谢。如果我的背景不清楚,请提前道歉,因为我仍然是编写正则表达式的新手。

4 个答案:

答案 0 :(得分:3)

using System;
using System.Text.RegularExpressions;

public class Program
{
    public static void Main()
    {
        // an example of input
        var input = "YH300s, H900H, 234, 90.5, +12D, 48E, R180S, 190A, 350A, J380S";

        var parts = input.Split(new[]{", "}, StringSplitOptions.RemoveEmptyEntries);
        // regex for numbers (including negative and floating-point)
        var regex = new Regex(@"[-]?[\d]?[\.]?[\d]+");

        foreach(var part in parts)
        {
            // there can be many matches, e.g. "A100B1111" => "100" and "1111"            
            foreach(Match m in regex.Matches(part))
            {
                if (double.Parse(m.Value) > 125)
                {
                    Console.WriteLine(part);
                    break;
                }
            }                   
        }           
    }
}

输出

YH300s
H900H
234
R180S
190A
350A
J380S

答案 1 :(得分:2)

如果您不想处理匹配项,可以使用以下正则表达式(对于大于125的数字):

(?!.*\..*)[^\s\,]*(12[5-9]|1[3-9]\d|[2-9]\d{2}|\d{4,})[^\s\,]*
                  ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^

代码:

var input = "YH300s, H900H, 234, 90.5, +12D, 48E, R180S, 190A, 350A, J380S";

foreach(var match in Regex.Matches(input,@"(?!.*\..*)[^\s\,]*(12[5-9]|1[3-9]\d|[2-9]\d{2}|\d{4,})[^\s\,]*"))
    {

        Console.WriteLine(match);

    }

请参阅Demo on Fiddle

答案 2 :(得分:2)

你可以使用 LINQ 和一个能处理 double 值(使用-+)的正则表达式来缩短它,甚至在以逗号设置为小数分隔符的操作系统上:

var input = "YH300s, H900H, 234, 90.5, +12D, 48E, R180S, 190A, 350A, J380S";
var reslts = input.Split(new[] { ',' }, StringSplitOptions.RemoveEmptyEntries)
                 .Where( p.Any(n => Char.IsDigit(n)) && 
                         p => double.Parse(Regex.Match(p, @"[-+]?\d+(?:\.\d+)?").Value,
                 System.Globalization.CultureInfo.GetCultureInfo("en-us")) > 125).ToList();

输出:

enter image description here

p.Any(n => Char.IsDigit(n))部分检查我们是否有任何数字,然后我们将数字与[-+]?\d+(?:\.\d+)?正则表达式匹配,并将它们解析为双值以进行进一步比较。

答案 3 :(得分:1)

在你的正则表达式中,你写的你的数字应该以2到5之间的一个数字开头,但是在你想要的结果中有H900H,R180S,190A不能从其中一个开始 - 所以你实际想要的是什么问题结果

如果您想匹配2-5之间的起始数字的字符串,请尝试: @"\w*[2-5]\d{2,}\w*"