【问题标题】:Regex to accept filename with single dot正则表达式接受单点文件名
【发布时间】:2017-10-25 10:39:43
【问题描述】:

我正在尝试构建一个正则表达式,它将验证具有单点的文件名,并且文件名具有由下划线分隔的三个部分

这是我下面的正则表达式:

(?<appname>[^_]*)_(?<eventtype>[^_]*)_(?<counter>[^_]*).*

输入字符串

ABA_ABA_2015_478.csv - 应该失败

ABA_ABA_2015478.js.csv - 应该失败

ABC_BCD_XYZ.js - 应该通过

请帮帮我。

【问题讨论】:

  • ^(?&lt;appname&gt;[^_]*)_(?&lt;eventtype&gt;[^_]*)_(?&lt;counter&gt;[^_]*)\.[^_.]*$

标签: java regex pattern-matching


【解决方案1】:

你可以使用这个正则表达式:

^(?<appname>[^_.]+)_(?<eventtype>[^_.]+)_(?<counter>[^._]*)\.[^.]+$

RegEx Demo

如果您在 Java 中使用 matches() 方法,那么您不需要使用锚点,因为锚点是隐式的。

RegEx 拆分:

  • ^:开始
  • (?&lt;appname&gt;[^_.]+):匹配并分组任何长度为 1+ 且不是 _ 和点的字符
  • (?&lt;eventtype&gt;[^_.]+):匹配并分组任何长度为 1+ 且不是 _ 和点的字符
  • _:匹配一个_
  • (?&lt;counter&gt;[^._]*):匹配并分组任何长度为 1+ 且不是 _ 和点的字符
  • \.:匹配一个点
  • [^.]+: 匹配任何长度为 1+ 且不是点的字符
  • $:结束

对于 Java 使用:

final String re = "^(?<appname>[^_.]+)_(?<eventtype>[^_.]+)_(?<counter>[^._]*)\\.[^.]+$";

【讨论】:

  • 对不起,先生,您迟到了,而且还错了:) 我在从左侧删除点方面仍然领先一步。不错的演示,我记得经常使用它。
  • 好吧,左边部分仍然可以包含点。尽管它们需要出现在 appname 或 eventtype 中,但您实际上已将其从最有可能引起任何问题的计数器中删除。
【解决方案2】:

在正则表达式中,点字符表示“任何字符”。您需要使用反斜杠对其进行转义(嗯,在 Java 中,您需要将反斜杠加倍以在 Java 字符串中转义反斜杠本身)。

因此,对于正确的部分,如果您还希望一些字符跟随点,则可以使用 \.\w+ 之类的东西。此外,在左侧部分中,从部分中排除点 - [^_.]*(或 [^_.]+ 表示非空)。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2015-08-08
    • 2023-03-24
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-05-30
    相关资源
    最近更新 更多