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

时间:2016-07-21 16:18:47

标签: c#

我有以下正则表达式:

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?

2 个答案:

答案 0 :(得分:1)

您的正则表达式不正确

你在说。+?为了价值。这意味着什么1个或更多与?意味着与否。

它应该是这样的:

^(?<Negate>!?)\[(?<Minimum>.*);(?<Maximum>.*)\]$

取代了+? with *表示两边有0或更多的东西

这是一个c#代码,用于执行您需要执行的操作:

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);
}

我建议你下载The regex coach。它可以帮助您测试正则表达式

编辑: 更改了min / max

的值

答案 1 :(得分:1)

从您的测试用例中,我认为使用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>.*?;.*?)\]$";

这里的主要问题是使用&#39; +?&#39;要求在&#39; *?&#39;时必须出现一次该值。表示0或更多。