我试图创建一个从给定字符串输入中提取大于125的字符串的表达式。
var input = "YH300s, H900H, 234, 90.5, +12D, 48E, R180S, 190A, 350A, J380S";
请查看链接以获取对我的脚本/数据示例的进一步参考。
这是我当前的表达式尝试(*):
Regex.Matches(input,@"(?!.*\..*)[^\s\,]*([2-5][\d]{2,})[^\s\,]*"))
从上面的表达式中,唯一的输出是350A, J380S
。
但是我想从输入字符串中提取以下输出(请参阅上面的链接以获得进一步的参考):
YH300s, H900H, R180S, 190A, 350A, J380S
对于我可能出错的地方的任何进一步指导将非常感谢。如果我的背景不清楚,请提前道歉,因为我仍然是编写正则表达式的新手。
答案 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);
}
答案 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();
输出:
p.Any(n => Char.IsDigit(n))
部分检查我们是否有任何数字,然后我们将数字与[-+]?\d+(?:\.\d+)?
正则表达式匹配,并将它们解析为双值以进行进一步比较。
答案 3 :(得分:1)
在你的正则表达式中,你写的你的数字应该以2到5之间的一个数字开头,但是在你想要的结果中有H900H,R180S,190A不能从其中一个开始 - 所以你实际想要的是什么问题结果
如果您想匹配2-5之间的起始数字的字符串,请尝试:
@"\w*[2-5]\d{2,}\w*"