查找具有不以特定属性开头的模式的字符串

时间:2017-10-18 19:14:40

标签: regex

我正在尝试创建一个正则表达式,以便在我的html文件中查找不正确的资源使用情况。对于此特定测试,我想返回字符串匹配@@[a-zA-Z0-9\._\-]*但不以i18n="开头的字符串。这就是我到目前为止所拥有的

/(?!i18n=")@{2}[a-zA-Z0-9\._\-]+/gi
但是我似乎无法让这种否定工作。这些是我的测试字符串,但我的表达式在第一行找到了匹配,这不是我所期望的。

This one is correct and should not be returned i18n="@@DashboardResources.ProgramContentTitle"
Bad, should be returned @@DashboardResources.ProgramContentTitle
@@DashboardResources.ProgramContentTitle is Bad and should be returned.
Bad, should be returned @@DashboardResources.ProgramContentTitle"
Bad, should be returned i8@@DashboardResources.ProgramContentTitle

我正在使用regex101进行测试。任何指针都会非常感激。

如果重要,最终用途将在使用System.Text.RegularExpressions.Regex类的c#应用程序中。

1 个答案:

答案 0 :(得分:1)

首先,如果要测试.NET正则表达式,请在RegexStorm.netRegexHero.net执行此操作,因为regex101不支持.NET正则表达式语法。当然,regex101很棒,因为它会自动解释模式,但Ultrapico Expresso工具也会为你做同样的事情。

接下来,(?!i18n=")构造看起来是提前,它匹配的位置不会紧跟i18n="子串。你需要的是背后的(?<!i18n="),它将匹配之前 的位置与i18n="子字符串。

var matches = Regex.Matches(s, @"(?<!i18n="")@@[a-zA-Z0-9._-]+")
        .Cast<Match>()
        .Select(m => m.Value)
        .ToList();

如果您分享有关文档外观和要求的更多详细信息,则可能会有一个不同的,更好的解决方案。要获得更加可靠的HTML分析方法,您可以使用HtmlAgilityPack和类似的库。