Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/307.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 使用正则表达式分析具有间隔的字符串_C# - Fatal编程技术网

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
的组合来实现相同的功能。是否可以不在正则表达式中直接拥有和获取它们?是否可以不在正则表达式中直接拥有和获取它们?