![](/img/trans.png)
[英]How can I write a Regex with matching groups for a comma separated string
[英]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.