c# - 使用正则表达式匹配由 - 分隔的字符串

标签 c# regex

正则表达式不是我最喜欢的东西,但它确实有它的用途。现在我正在尝试匹配包含此内容的字符串。

[video-{service}-{id}] 

此类字符串的示例:

[video-123abC-zxv9.89]

在上面的示例中,我想获取“service”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();

这不起作用,并将“[video-”之后的所有字符放入 Id 变量中。

有什么建议吗?

最佳答案

第三部分似乎是可选的。 [^]]+实际上匹配 -符号,要修复表达式,您需要创建第一个 [^]]+惰性 ( [^]]+? ) 或向否定字符类添加连字符。

使用

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

请参阅regex demo

或者使用惰性字符类:

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

参见another demo .

由于您使用的是命名组,因此您可以使用 RegexOptions.ExplicitCapture 编译正则表达式对象。使正则表达式引擎将所有编号的捕获组视为非捕获组的选项(以便不在定义可选 ?: 组的 ( 之后添加 (-(?<id2>[^]-]+))?)。

关于c# - 使用正则表达式匹配由 - 分隔的字符串,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/45000493/

相关文章:

c# - 对于 EF 上下文,实例变量和局部变量哪个更好?

c# - 模式 : "if (obj is Abc && (obj as Abc) ...)" 的方法

c# - 单元测试 EF 的状态管理代码

c# - 使用 ASP.NET MVC 获取用户的本地路径

python - 正则表达式处理后在句末添加标点符号: Python

javascript - 使用 JavaScript 检测文本中的 URL

c# - 为什么静态方法只允许调用静态方法而不是非静态方法

javascript - 如何在其中任何一个发生变化时反转前景色和背景色

正则表达式仅选择点,但前后不应有任何数字

ruby - 替换 ruby 中括号之间的特定字符