\.((jpg)|(gif)|(jpeg)|(png)|(doc)|(docx)|(pdf)|(zip)|(rar))$
这是我在Regex Hero中测试的正则表达式。测试字符串是Sprite.png
只有2个简单的问题
答案 0 :(得分:3)
匹配显示为2组为什么会这样?
因为有两组。 ((png))
是两组。 ((jpeg)|(png))
也是如此。
我使用相同的表达式是.net正则表达式验证器,它没有正确验证。
尝试更简单的正则表达式。分别对每个扩展分组是完全没有意义的。
\.(jpg|gif|jpeg|png|doc|docx|pdf|zip|rar)$
还要考虑使正则表达式不区分大小写,否则它将不匹配大写扩展。
答案 1 :(得分:2)
png
的较小的组。你可以删除内部的:\.(jpg|gif|jpeg|png|doc|docx|pdf|zip|rar)$
也可以。答案 2 :(得分:1)
它有两组,因为你有两组括号。我用星星和空格标记了它们:
\. *(* (jpg)|(gif)|(jpeg)| *(* png *)* |(doc)|(docx)|(pdf)|(zip)|(rar) *)* $
这两个组都匹配。您可以使用(?:
:
\.(?:(jpg)|(gif)|(jpeg)|(png)|(doc)|(docx)|(pdf)|(zip)|(rar))$
你的正则表达式在.NET上验证得很好。但请注意,在C#中,反斜杠是字符串中的特殊字符。如果你想使用正则表达式反斜杠,你需要转义它:
var re = new Regex("\\.(?:(jpg)|(gif)|(jpeg)|(png)|(doc)|(docx)|(pdf)|(zip)|(rar))$");
最好,你应该使用逐字字符串,避免笨重的双重逃避:
var re = new Regex(@"\.(?:(jpg)|(gif)|(jpeg)|(png)|(doc)|(docx)|(pdf)|(zip)|(rar))$");