匹配字符串 - 使用正则表达式分隔

时间:2017-07-09 20:02:23

标签: c# 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();

这不起作用,并把所有的追赶者放在&#39; [视频 - &#39;进入Id变量。

有什么建议吗?

2 个答案:

答案 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