正则表达式不是我最喜欢的东西,但它确实有它的用途。现在我正在尝试匹配包含此内容的字符串。
[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/