[英]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.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>.*?;.*?)\]$";
這里的主要問題是'+?'的用法 要求“ *?”中必須存在該值一次 表示0或更大。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.