[英]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)
- Avg
, Max
或Min
[OHLVC]
- 集合中的一個大寫字母 \\d+
- 1位或更多位數 (?:\\.\\d+)?
- 一個可選的序列.
后跟一個或多個數字。 旁注:最佳做法是禁止同一個交替組的分支在同一個位置匹配,並且(?:Avg|Max|Min)
更好地寫為(?:Avg|M(?:ax|in))
。 然而,對於人眼來說,對機器有益的不是很好,所以由於可讀性的原因,我建議保持第一組不變。
C#demo (請注意, RegexOptions.ExplicitCapture
是RegexOptions.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.