簡體   English   中英

匹配字符串,由-使用正則表達式分隔

[英]Matching string separated by - using regex

正則表達式不是我最喜歡的東西,但是它肯定有它的用途。 現在,我正在嘗試匹配包含此內容的字符串。

[video-{service}-{id}] 

這樣的字符串的示例:

[視頻123ABC-zxv9.89]

在上面的示例中,我想獲取“服務” 123abC和“ id” zxv9.89。

到目前為止,這就是我所擁有的。 可能過分復雜了。

var regexPattern = @"\[video-(?<id1>[^]]+)(-(?<id2>[^]]+))?\]";
var ids = Regex.Matches(text, regexPattern, RegexOptions.IgnoreCase)
    .Cast<Match>()
    .Select(m => new VideoReplaceItem()
    {
        Tag = m.Value,
        Id = string.IsNullOrWhiteSpace(m.Groups["id1"].Value) == false ? m.Groups["id1"].Value : "",
        Service = string.IsNullOrWhiteSpace(m.Groups["id2"].Value) == false ? m.Groups["id2"].Value : "",
    }).ToList();

這不起作用,並將“ [視頻-”之后的所有字符都放入Id變量中。

有什么建議么?

第三部分似乎是可選的。 [^]]+實際上與-符號匹配,並且要修復表達式,您需要使第一個[^]]+惰性( [^]]+? )或在否定的字符類中添加連字符。

采用

\[video-(?<id1>[^]-]+)(-(?<id2>[^]-]+))?]

正則表達式演示

或使用惰性字符類:

\[video-(?<id1>[^]]+?)(-(?<id2>[^]]+))?]
                    ^

參見另一個演示

既然你是使用命名組,您可以編寫regex對象與RegexOptions.ExplicitCapture選項使正則表達式引擎對待所有編號的捕獲組作為非捕獲者(以免增加?:(即定義了可選的(-(?<id2>[^]-]+))?組)。

嘗試這個:

\[video-(?<service>[^]]+?)(-(?<id>[^]]+))?\]

“?” 服務組中的表達式使表達式在其之前成為“惰性”(這意味着它與盡可能少的字符匹配才能滿足整個表達式)。

我會推薦Regexstorm.net進行.NET regex測試: http ://regexstorm.net/tester

暫無
暫無

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

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