繁体   English   中英

使用正则表达式使用时间间隔解析字符串

[英]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.SplitIndexOf可以提高效率。

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.

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