Java 为单元测试构建UUID介于两者之间的正则表达式?
我有一个独特的文件名生成器,正在与REGEX模式斗争。我想在单元测试中断言输出字符串有效: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, ""
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
*-[0-9]{8}-[0-9a-f]{32}\..[^.]+\.gz
(regex新手?请注意,这些反斜杠是regex本身要求的,而不是java编译器要求的。使用现在的IDE,粘贴到代码中时应自动添加额外的反斜杠。如果没有,请将任何\
替换为\
。)
说明:
任意长度\u字母\u数字\u前缀
和分隔符:*
,为其自身匹配-
。正则表达式中的
匹配任何内容yyyyMMdd
和分隔符:为了简单起见,我们使用[0-9]{8}-
来匹配任意8位数字,而不是严格有效的日期。对于严格的日期验证,互联网上有很多[0-9a-f]{32}
就足够了。然后\。
,点被转义,因此现在它匹配自身extensionType
:我们假设它是一个没有点的任意序列。因此,我们使用[^.]+
来匹配一个或多个非点字符。如果已知所有文件都是csv文件,则也可以将其硬编码为csv.gz
:使用\.gz
*-[0-9]{8}-[0-9a-f]{32}\..[^.]+\.gz
(regex新手?请注意,这些反斜杠是regex本身要求的,而不是java编译器要求的。使用现在的IDE,粘贴到代码中时应自动添加额外的反斜杠。如果没有,请将任何\
替换为\
。)
说明:
任意长度\u字母\u数字\u前缀
和分隔符:*
,为其自身匹配-
。正则表达式中的
匹配任何内容yyyyMMdd
和分隔符:为了简单起见,我们使用[0-9]{8}-
来匹配任意8位数字,而不是严格有效的日期。对于严格的日期验证,互联网上有很多[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嵌入了日期时间,有些则没有。此外,嵌入的日期从未用于可靠的时间跟踪。通用唯一标识符的目的是唯一标识,而不是跟踪历史。