【问题标题】:A Question on group matches in regex关于正则表达式中的组匹配问题
【发布时间】:2011-04-18 23:11:54
【问题描述】:

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

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

【问题讨论】:

  • 您使用了什么 .NET 验证器?我会说它坏了。我的安装接受它就好了。
  • @Martin 偏离正则表达式验证器。这是标记<asp:RegularExpressionValidator id="RegularExpressionValidator1" runat="server" display="Dynamic" enableclientscript="true" controltovalidate="fileUpload" validationexpression="\.((jpg)|(gif)|(jpeg)|(png)|(doc)|(docx)|(pdf)|(zip)|(rar))$"></asp:RegularExpressionValidator>
  • 所以是的,绝对是反斜杠的两倍。
  • @Tim 你的意思是\\.jpg|gif|jpeg|png|doc|docx|pdf|zip|rar$ 这对我也不起作用
  • 为什么去掉所有的括号?

标签: .net asp.net regex


【解决方案1】:

比赛显示为 2 个组为什么会这样?

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

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

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

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

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

【讨论】:

  • @Tomalak Also think of making the regex case-insensitive, 你知道我如何使用 .net 验证控件中的正则表达式验证器来做到这一点
  • @Deeptechtons:将(?i) 添加到正则表达式的开头。这称为内联修饰符。 stackoverflow.com/questions/3542042/…
  • @Tomalak 谢谢顺便说一句,你能不能放一个正则表达式来验证文件名和扩展名。我试过^[a-zA-Z0-9_]{5,20}+,但它在扩展名中也占.png
  • @Deeptechtons:"(?i)^[a-z0-9_]{5,20}\\.(jpg|gif|jpeg|png|doc|docx|pdf|zip|rar)$" 不行吗? PS:下次提示:想想你的问题并完整地提出。不得不在侦探科伦坡模式中添加点点滴滴的信息(“哦,再问一个问题,先生!”)并不是很有价值。
  • @Tomalak 你是个天才,我不想用另一个具有相同想法或背景的问题来困扰人们。再次感谢
【解决方案2】:
  1. 两个组匹配:较大的一组围绕整个交替,较小的一组围绕文字文本png。您可以删除内部的:\.(jpg|gif|jpeg|png|doc|docx|pdf|zip|rar)$ 也可以。
  2. 尝试将反斜杠加倍。

【讨论】:

  • 我现在如何限定文件名我尝试了^[a-zA-Z0-9_]+$,但它也解释了扩展名.png 中的. 我如何验证文件名包含字母数字和下划线只省略@987654326 @ 或者说我想用相同的验证表达式验证文件名和扩展名
【解决方案3】:

它有两组,因为你有两组括号。我用星号和空格标记了它们:

\. *(* (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))$");

【讨论】:

  • 所以大括号也说明了​​与 png 的匹配?
  • 请在帖子#1 中查看我对您的问题的评论
  • 是的。它将“png”部分捕获到两个组中。内部匹配,因为那正是字符串“png”。外部匹配,因为它匹配所有这些选项之一。
猜你喜欢
  • 2020-07-01
  • 2011-07-17
  • 1970-01-01
  • 2017-09-21
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多