2017-10-18 59 views
1

我想创建一个正则表达式来查找我的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 [email protected]@DashboardResources.ProgramContentTitle 

我正在使用regex101进行测试。任何指针将不胜感激。


它应该的事情,最终的使用都必须使用System.Text.RegularExpressions.Regex类C#应用程序。

+1

你需要向后看,'(?<!i18n =“)@ {2} [a-zA-Z0-9 ._-] +' –

+0

@WiktorStribiżew - 谢谢!你想要回答?我会在宽限期到期后立即接受 – Igor

回答

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和类似的库。

+0

再次感谢你我创建了一个单元测试来遍历我们创建'.html'文件的文件夹,并且如果任何html文件包含本地化资源不符合这个模式在你的帮助下,除了最后一部分之外,我都拥有一切 – Igor

+0

@Igor:对不起,我不明白:你想要一个匹配'@@ [a-zA-Z0-9._ i18n =“'后面的'] +模式? '@ “I18N =” “@@ [A-ZA-Z0-9 ._-] +”'? –

+0

我明白了。我添加了你的东西,但RegEx101不喜欢它,但你推荐的网站(RegexStorm)做的。谢谢你,我会将该链接添加到我的收藏夹。 – Igor

相关问题