关于正则表达式中组匹配的问题

时间:2011-04-11 11:56:38

标签: .net asp.net regex

\.((jpg)|(gif)|(jpeg)|(png)|(doc)|(docx)|(pdf)|(zip)|(rar))$这是我在Regex Hero中测试的正则表达式。测试字符串是Sprite.png只有2个简单的问题

  1. 匹配显示为2组为什么会这样?测试字符串只包含一个png
  2. 我使用相同的表达式是.net正则表达式验证器,它没有正确验证。我希望文件输入允许组中的扩展名

3 个答案:

答案 0 :(得分:3)

  

匹配显示为2组为什么会这样?

因为有两组。 ((png))是两组。 ((jpeg)|(png))也是如此。

  

我使用相同的表达式是.net正则表达式验证器,它没有正确验证。

尝试更简单的正则表达式。分别对每个扩展分组是完全没有意义的。

\.(jpg|gif|jpeg|png|doc|docx|pdf|zip|rar)$

还要考虑使正则表达式不区分大小写,否则它将不匹配大写扩展。

答案 1 :(得分:2)

  1. 两个组匹配:围绕整个交替的大组,以及围绕文字文本png的较小的组。你可以删除内部的:\.(jpg|gif|jpeg|png|doc|docx|pdf|zip|rar)$也可以。
  2. 尝试加倍反斜杠。

答案 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))$");