簡體   English   中英

使用正則表達式使用時間間隔解析字符串

[英]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.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>.*?;.*?)\]$";

這里的主要問題是'+?'的用法 要求“ *?”中必須存在該值一次 表示0或更大。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM