正则表达式接受带有单点

时间:2017-10-25 10:39:44

标签: java regex pattern-matching

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

这是我的正则表达式:

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

输入字符串

ABA_ABA_2015_478.csv - 应该失败

ABA_ABA_2015478.js.csv - 应该失败

ABC_BCD_XYZ.js - 应该通过

请帮助我。

2 个答案:

答案 0 :(得分:0)

在正则表达式中,点字符表示&#34;任何字符&#34;。你需要使用反斜杠来逃避它(在Java中,你需要加倍反斜杠以逃避Java字符串中的反斜杠本身。)

所以,对于正确的部分,像\.\w+这样的东西可以做,如果你还想要一些字符跟随点。此外,在左侧部分中,从部分中排除点 - [^_.]*(或[^_.]+表示非空)。

答案 1 :(得分:0)

您可以使用此正则表达式:

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

RegEx Demo

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

RegEx分手:

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

对于Java使用:

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