簡體   English   中英

C#Regex獲取帶十進制數的特定字符

[英]C# Regex get specific character with decimal number

我需要一個正則表達式,返回特定字符,十進制數最多為1位

我有字符串文字

(AvgC20.1 > 980000) && (C1>C2) MaxC20 MinC20.14

應用正則表達式后得到以下結果

AvgC20, MaxC20, MinC20

這是我正在使用的正則表達式

(Avg|Max|Min)[OHLVC]\d+

返回我想要的但不返回十進制數到一個地方

但我需要這樣的結果

AvgC20.1, MaxC20, MinC20.1

添加一個可選項(?:\\.\\d+)? 匹配1或0次出現的a . 后跟一個或多個數字:

(?:Avg|Max|Min)[OHLVC]\d+(?:\.\d+)?
                         ^^^^^^^^^^

請參閱正則表達式演示

在此輸入圖像描述

(?:...)? 是一個可選的非捕獲 由於?是可選的(=匹配一次或零次) 量詞(貪婪的,這就是為什么我提到一個或零 ,而不是零或一個 )。 非捕獲組用於分組目的,而不為存儲器中捕獲的值創建緩沖區。 我建議使用捕獲組,因為最終結果應該等於整個匹配值 ,因此,不需要跟蹤和存儲這些子值。

注意.NET中的非/捕獲組 :在.NET代碼中,您實際上可以使用編號的捕獲組,並使用RegexOptions.ExplicitCapture標志使它們不可捕獲。 然后,僅為命名捕獲組創建內存緩沖區(如(?<gr1>...) )。

圖案細節

  • (?:Avg|Max|Min) - AvgMaxMin
  • [OHLVC] - 集合中的一個大寫字母
  • \\d+ - 1位或更多位數
  • (?:\\.\\d+)? - 一個可選的序列. 后跟一個或多個數字。

旁注:最佳做法是禁止同一個交替組的分支在同一個位置匹配,並且(?:Avg|Max|Min)更好地寫為(?:Avg|M(?:ax|in)) 然而,對於人眼來說,對機器有益的不是很好,所以由於可讀性的原因,我建議保持第一組不變。

C#demo (請注意, RegexOptions.ExplicitCaptureRegexOptions.ExplicitCapture(?n)選項的幫助下傳遞的):

var s = "(AvgC20.1 > 980000) && (C1>C2) MaxC20 MinC20.14";
var pattern = @"(?n)(Avg|Max|Min)[OHLVC]\d+(\.\d+)?";
var result = Regex.Matches(s, pattern)
        .Cast<Match>()
        .Select(p => p.Value)
        .ToList();
foreach (var r in result) // Demo printing the results
    Console.WriteLine(r);

暫無
暫無

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

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