Java中的特殊正则表达式语法

Java中的特殊正则表达式语法,java,regex,Java,Regex,我使用正则表达式作为图像文件名。 我使用正则表达式的主要原因是为了防止多个文件用于完全相同的目的 文件名的语法可以是: 1) img_0F_16_-32_0.png 2) img_65_32_x.png 正如您可能已经注意到的,“img_”是通用前缀。 下面是一个两位数的十六进制数。 在另一个下划线之后是一个整数,必须是2的幂,介于1到512之间。下一个是另一个下划线 好的,到目前为止,我的正则表达式工作得非常完美。 剩下的就是我遇到的问题: 因为后面可以是一对整数坐标(可以是0)

我使用正则表达式作为图像文件名。 我使用正则表达式的主要原因是为了防止多个文件用于完全相同的目的

文件名的语法可以是:

1)    img_0F_16_-32_0.png
2)    img_65_32_x.png
正如您可能已经注意到的,“img_”是通用前缀。 下面是一个两位数的十六进制数。 在另一个下划线之后是一个整数,必须是2的幂,介于1到512之间。下一个是另一个下划线

好的,到目前为止,我的正则表达式工作得非常完美。 剩下的就是我遇到的问题: 因为后面可以是一对整数坐标(可以是0),用下划线分隔,也可以是x。之后是最后的“.png”。完成了

现在我面临的主要问题是两种变体都必须是可能的, 而且,非常重要的是,可能没有任何重复的坐标。 最重要的是,正整数和负整数可能永远不会以一个或多个零开始! 这将产生如下重复:

401 = 00401
-10 = -0010
这是我第一次尝试:

img_[0-9a-fA-F]{2}_(1|2|4|8|16|32|64|128|256|512)_([-]?[1-9])?[0-9]*_([-]?[1-9])?[0-9]*[.]png
提前感谢您的帮助


Tom S.

为什么要使用正则表达式?为什么不创建一个将字符串的任一变体分解为规范字符串的类,为该类提供一个使用该规范字符串的
hashCode()
equals()
方法,然后创建这些对象的HashSet,以确保仅存在其中一种类型的文件?

为什么使用正则表达式?为什么不创建一个将字符串的任一变体分解为规范字符串的类,为该类提供一个使用该规范字符串的
hashCode()
equals()
方法,然后创建这些对象的HashSet,以确保仅存在其中一种类型的文件?

+1。我发现字符串解析代码通常编写得更快,更容易理解,更容易调试,如果您只是将其作为普通代码编写,而不是尝试将正则表达式用于各种用途。实际上,我在文件名筛选器中使用正则表达式。这一点很重要,因为我从中加载文件的目录包含大约2500个文件。如果您处理的文件太多,那么您还有一个理由不使用regex。它比一个简单的解析器慢。@TomS.:您可以编写一个
FilenameFilter
来执行您喜欢的任何逻辑。没有必要将其限制为正则表达式。对于我们在这里讨论的字符串长度(文件名),通过一些简单的解析代码,您很有可能比正则表达式更快。无论哪种方式,2500次字符串解析都太少了,在任何速度相当快的机器上都不会产生真正的性能影响。+1。我发现字符串解析代码通常编写得更快,更容易理解,更容易调试,如果您只是将其作为普通代码编写,而不是尝试将正则表达式用于各种用途。实际上,我在文件名筛选器中使用正则表达式。这一点很重要,因为我从中加载文件的目录包含大约2500个文件。如果您处理的文件太多,那么您还有一个理由不使用regex。它比一个简单的解析器慢。@TomS.:您可以编写一个
FilenameFilter
来执行您喜欢的任何逻辑。没有必要将其限制为正则表达式。对于我们在这里讨论的字符串长度(文件名),通过一些简单的解析代码,您很有可能比正则表达式更快。无论哪种方式,2500次字符串解析都太少了,在任何速度相当快的机器上都不会产生真正的性能影响。