Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/391.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 为单元测试构建UUID介于两者之间的正则表达式?_Java_Regex - Fatal编程技术网

Java 为单元测试构建UUID介于两者之间的正则表达式?

Java 为单元测试构建UUID介于两者之间的正则表达式?,java,regex,Java,Regex,我有一个独特的文件名生成器,正在与REGEX模式斗争。我想在单元测试中断言输出字符串有效: private static final String FILE_NAME_DELIMITER = "-"; private static final Supplier<String> getRandomUUID = () -> UUID.randomUUID().toString().replace(FILE_NAME_DELIMITER, ""

我有一个独特的文件名生成器,正在与REGEX模式斗争。我想在单元测试中断言输出字符串有效:

    private static final String FILE_NAME_DELIMITER = "-";
    private static final Supplier<String> getRandomUUID = () ->
            UUID.randomUUID().toString().replace(FILE_NAME_DELIMITER, "");
private静态最终字符串文件_NAME_DELIMITER=“-”;
私有静态最终供应商getRandomUUID=()->
UUID.randomuid().toString().replace(文件名\分隔符“”);
这就是UUID的生成方式

这是输出字符串
filePrefix yyyyMMdd UUID.csv.gz

我要找的正则表达式是
任意长度\u字母\u数字\u前缀-yyyyMMdd-UUID.extensionType.gz

  • 任意长度字母数字前缀=任意长度可变的字母或数字
  • yyyyMMdd=此位置应存在此日期格式
  • UUID=由上述代码生成的UUID
  • extensionType.gz=需要是.csv.gz
要匹配以测试文件名的格式是否符合预期,还是要从文件名中提取日期和UUID

如果您只是想测试文件名,正则表达式应该是:

*-[0-9]{8}-[0-9a-f]{32}\..[^.]+\.gz
(regex新手?请注意,这些反斜杠是regex本身要求的,而不是java编译器要求的。使用现在的IDE,粘贴到代码中时应自动添加额外的反斜杠。如果没有,请将任何
\
替换为
\
。)

说明:

  • 为任意内容匹配
    任意长度\u字母\u数字\u前缀
    和分隔符:
    *
    ,为其自身匹配
    -
    。正则表达式中的
    匹配任何内容

  • yyyyMMdd
    和分隔符:为了简单起见,我们使用
    [0-9]{8}-
    来匹配任意8位数字,而不是严格有效的日期。对于严格的日期验证,互联网上有很多

  • 对于UUID和点:UUID是32个字符(0~f十六进制数字),不带分隔符。所以
    [0-9a-f]{32}
    就足够了。然后
    \。
    ,点被转义,因此现在它匹配自身

  • extensionType
    :我们假设它是一个没有点的任意序列。因此,我们使用
    [^.]+
    来匹配一个或多个非点字符。如果已知所有文件都是csv文件,则也可以将其硬编码为csv

  • 扩展名
    .gz
    :使用
    \.gz

  • 您想匹配以测试文件名的格式是否符合预期,还是从文件名中提取日期和UUID

    如果您只是想测试文件名,正则表达式应该是:

    *-[0-9]{8}-[0-9a-f]{32}\..[^.]+\.gz
    
    (regex新手?请注意,这些反斜杠是regex本身要求的,而不是java编译器要求的。使用现在的IDE,粘贴到代码中时应自动添加额外的反斜杠。如果没有,请将任何
    \
    替换为
    \
    。)

    说明:

  • 为任意内容匹配
    任意长度\u字母\u数字\u前缀
    和分隔符:
    *
    ,为其自身匹配
    -
    。正则表达式中的
    匹配任何内容

  • yyyyMMdd
    和分隔符:为了简单起见,我们使用
    [0-9]{8}-
    来匹配任意8位数字,而不是严格有效的日期。对于严格的日期验证,互联网上有很多

  • 对于UUID和点:UUID是32个字符(0~f十六进制数字),不带分隔符。所以
    [0-9a-f]{32}
    就足够了。然后
    \。
    ,点被转义,因此现在它匹配自身

  • extensionType
    :我们假设它是一个没有点的任意序列。因此,我们使用
    [^.]+
    来匹配一个或多个非点字符。如果已知所有文件都是csv文件,则也可以将其硬编码为csv

  • 扩展名
    .gz
    :使用
    \.gz


  • 为什么不保持UUID十六进制字符串表示的标准格式的连字符,并在日期周围使用另一个分隔符呢?似乎这样可以(a)保持UUID的可识别性,以及(b)通过反射让事情变得更容易。@BasilBourque是的,UUID已经与时间相关,所以他实际上不需要日期。@MeowCat2012否,有些UUID嵌入了日期时间,有些则没有。此外,嵌入的日期从未用于可靠的时间跟踪。通用唯一标识符的用途是唯一标识,而不是跟踪历史。为什么不将连字符保留为UUID十六进制字符串表示的规范格式,并在日期周围使用另一个分隔符?似乎这样可以(a)保持UUID的可识别性,以及(b)通过反射让事情变得更容易。@BasilBourque是的,UUID已经与时间相关,所以他实际上不需要日期。@MeowCat2012否,有些UUID嵌入了日期时间,有些则没有。此外,嵌入的日期从未用于可靠的时间跟踪。通用唯一标识符的目的是唯一标识,而不是跟踪历史。