我有以下正则表达式:
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?
答案 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.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>.*?;.*?)\]$";
这里的主要问题是使用&#39; +?&#39;要求在&#39; *?&#39;时必须出现一次该值。表示0或更多。