C# 使用正则表达式分析具有间隔的字符串
我有以下正则表达式:C# 使用正则表达式分析具有间隔的字符串,c#,C#,我有以下正则表达式: String pattern = @"^(?<Negate>!*)\[(?<Value>.+?;.+?)\]$"; 问题是我的正则表达式与“[;8]”或“[2;]”不匹配 如何更改此代码,以便使用Min和Max、only Min或only Max解析间隔?您的正则表达式不正确 你是说?为了价值。这意味着有1个或更多的?不管有没有 应该是这样的: ^(?<Negate>!?)\[(?<Minimum>.*);(?<Max
String pattern = @"^(?<Negate>!*)\[(?<Value>.+?;.+?)\]$";
问题是我的正则表达式与“[;8]”或“[2;]”不匹配
如何更改此代码,以便使用Min和Max、only Min或only Max解析间隔?您的正则表达式不正确 你是说?为了价值。这意味着有1个或更多的?不管有没有 应该是这样的:
^(?<Negate>!?)\[(?<Minimum>.*);(?<Maximum>.*)\]$
^(?)\[(?*);(?*)\]$
替换了+?带*表示两边都有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);
}
var模式=@“^(?)\[(?*);(?*)\]$”;
var match=Regex.match(“[2;8]”,模式);
如果(匹配成功)
{
var min=匹配组[“最小值”]值;
var max=匹配组[“最大”]值;
var negate=!String.IsNullOrEmpty(match.Groups[“negate”].Value);
WriteLine(“Min={0}-Max={1}-Negative={2}”,Min,Max,negate);
}
我建议你下载。它可以帮助你测试你的正则表达式
编辑:
更改了min/max的值,正则表达式不正确 你是说?为了价值。这意味着有1个或更多的?不管有没有 应该是这样的:
^(?<Negate>!?)\[(?<Minimum>.*);(?<Maximum>.*)\]$
^(?)\[(?*);(?*)\]$
替换了+?带*表示两边都有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);
}
var模式=@“^(?)\[(?*);(?*)\]$”;
var match=Regex.match(“[2;8]”,模式);
如果(匹配成功)
{
var min=匹配组[“最小值”]值;
var max=匹配组[“最大”]值;
var negate=!String.IsNullOrEmpty(match.Groups[“negate”].Value);
WriteLine(“Min={0}-Max={1}-Negative={2}”,Min,Max,negate);
}
我建议你下载。它可以帮助你测试你的正则表达式
编辑:
更改了测试用例中min/max的值,我认为使用
string.Split
和IndexOf
的组合可以获得更好的效率。i、 e
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>.*?;.*?)\]$";
String模式=@“^(?!*)\[(?*?;*?)\]$”;
这里的主要问题是,“+?”的使用要求值必须出现一次,而“*?”表示0或更多。从您的测试用例中,我认为您可以使用
string.Split
和IndexOf
的组合来获得更好的效率。i、 e
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>.*?;.*?)\]$";
String模式=@“^(?!*)\[(?*?;*?)\]$”;
这里的主要问题是,“+?”的使用要求该值必须出现一次,而“*?”表示0或更多。什么是
代码>前面是什么意思?您是否有输入格式的详尽列表?请参阅!前面的意思是我想否定间隔。。。这似乎不是一个复杂的输入,所以我认为正则表达式可能不是一个有效的解决方案。您可以轻松地使用string.Split
和IndexOf
的组合来实现相同的功能。的功能是什么代码>前面是什么意思?您是否有输入格式的详尽列表?请参阅!前面的意思是我想否定间隔。。。这似乎不是一个复杂的输入,所以我认为正则表达式可能不是一个有效的解决方案。您可以很容易地使用string.Split
和IndexOf
的组合来实现相同的功能。是否可以不在正则表达式中直接拥有和获取它们?是否可以不在正则表达式中直接拥有和获取它们?