正则表达式不是我最喜欢的东西,但它肯定有它的用途。现在我正试图匹配由此组成的字符串。
[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();
这不起作用,并把所有的追赶者放在&#39; [视频 - &#39;进入Id变量。
有什么建议吗?
答案 0 :(得分:2)
第三部分似乎是可选的。 [^]]+
实际上与-
符号匹配,要修复表达式,您需要先使[^]]+
懒惰([^]]+?
)或添加连字符人物类。
使用
\[video-(?<id1>[^]-]+)(-(?<id2>[^]-]+))?]
请参阅regex demo
或者使用懒惰的角色类:
\[video-(?<id1>[^]]+?)(-(?<id2>[^]]+))?]
^
请参阅another demo。
由于您使用的是命名组,因此可以使用RegexOptions.ExplicitCapture
选项编译正则表达式对象,以使正则表达式引擎将所有编号的捕获组视为非捕获组(以便在之后不添加?:
定义可选(
组的(-(?<id2>[^]-]+))?
。
答案 1 :(得分:2)
试试这个:
\[video-(?<service>[^]]+?)(-(?<id>[^]]+))?\]
“?”在服务组中使表达式“懒惰”(意味着它匹配尽可能少的字符以满足整体表达式)。
我建议使用Regexstorm.net进行.NET正则表达式测试:http://regexstorm.net/tester