[英]Parse String with Interval using Regex
我有以下正则表达式:
String pattern = @"^(?<Negate>!*)\[(?<Value>.+?;.+?)\]$";
将字符串解析为“ [2; 8]”和“![2; 8]”。 所以我有:
Match match = Regex.Match("[2;8]", pattern);
if (match.Success) {
String[] values = match.Groups["Value"].Value.Split(';');
String minimum = values[0];
String maximum = values[1];
Boolean negate = match.Groups["Negate"].Value.Length % 2 != 0;
}
问题是我的正则表达式与“ [; 8]”或“ [2;]”不匹配。
如何更改此代码,以便可以用Min和Max,只有Min或只有Max来解析时间间隔?
您的正则表达式不正确
你在说。+? 价值。 这表示带有1个或多个的任何东西。 意味着有没有。
应该是这样的:
^(?<Negate>!?)\[(?<Minimum>.*);(?<Maximum>.*)\]$
换成+? 带*的意思是两面都等于或大于0
这是ac#代码,您需要执行以下操作:
var pattern = @"^(?<Negate>!?)\[(?<Minimum>.*);(?<Maximum>.*)\]$";
var match = Regex.Match("[2;8]", pattern);
if (match.Success)
{
var min = match.Groups["Minimum"].Value;
var max = match.Groups["Maximum"].Value;
var negate = !String.IsNullOrEmpty(match.Groups["Negate"].Value);
Console.WriteLine("Min = {0} - Max = {1} - Negative = {2}",min,max,negate);
}
我建议您下载regex教练 。 它可以帮助您测试正则表达式
编辑:更改最小值/最大值的值
从您的测试用例中,我认为结合使用string.Split
和IndexOf
可以提高效率。 即
string input = "[2;8]";
bool negate = false;
if(input[0] == '!'){
negate = true;
input = input.Substring(1);
}
string[] values = input.Split(';');
string minimum = values[0];
string maximum = values[1];
但是,只需对原始模式进行简单的修改即可解决问题。
String pattern = @"^(?<Negate>!*)\[(?<Value>.*?;.*?)\]$";
这里的主要问题是'+?'的用法 要求“ *?”中必须存在该值一次 表示0或更大。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.