.NET 正则表达式与它应该 [复制] 的内容不匹配

.NET Regex not matching something it should [duplicate]

提问人:Superguppie 提问时间:5/9/2023 最后编辑:InSyncSuperguppie 更新时间:5/9/2023 访问量:33

问:

我有以下代码:

public string LoadTemplate()
{
    return "<!-- *style -->\r\n<style>\r\n    .page {\r\n        display: grid;\r\n        grid-template-columns: repeat(3, 1fr);\r\n        grid-template-rows: repeat(7, 13.468%);\r\n        align-content: end;\r\n        width: var(--w);\r\n        aspect-ratio: 210 / 297; /* A4 portrait */\r\n    }\r\n</style>\r\n<!-- /style -->\r\n<div class=\"page\" style=\"[style]\">\r\n[items]\r\n</div>";
}
private static Regex _styleRegex = new Regex(@"<!-- \*style -->(.+)<!-- \/style -->", RegexOptions.Multiline);
public string Style
{
    get
    {
        var match = _styleRegex.Match(LoadTemplate());
        if (match.Success)
        {
            return match.Groups[1].Value;
        }
        return null;
    }
}

(LoadTemplate 的原始版本功能更多。简而言之,我只是让它在这里返回一个示例模板。 当获得 Style 时,我得到 null。

我希望得到样式部分,但没有围绕它的 html 注释。

我使用了几个在线正则表达式测试器,看看我是否能找到问题所在。所有这些都表示应该有匹配项,并且组 1 应该包含源字符串的样式部分。

我追踪了 Style-get。并匹配。成功总是假的。

如何找出问题所在?

.NET 正则表达式

评论


答:

1赞 sln 5/9/2023 #1

您只需要启用 Dot-all 模式,这样点就会与换行符匹配。
并跨越线条。
(?s)

@"(?s)<!--\s*\*\s*style\s*-->(.+?)<!--\s*/style\s*-->"

https://regex101.com/r/JuYFsB/1

(?s)
<!-- \s* \* \s* style \s* -->
( .+? )                       # (1)
<!-- \s* /style \s* -->

添加可选的空白区域使其更加灵活。