正则表达式为Maven神器般的路径

时间:2016-05-23 12:28:32

标签: regex bash grep

我试图为以下案例提出一个正则表达式...

我们正在清理一些未正确部署到存储库的Maven工件。用于命名工件的Maven格式如下:

${groupId}/${artifactId}/${version}/${artifactId}-${version}-${classifier}.jar

其中:

  • groupId:工件的组ID(通用包名称),例如com.foo(由Maven将点扩展为通配符)
  • artifactId:工件的ID,例如bar
  • version:版本,例如1.2.3
  • classifier:这是一个可选属性,允许您指定子工件,例如sourcesjavadocsjdk14等等。 ,或者可能不存在。

以下是一些有效路径:

com/foo/bar/1.2.3/bar-1.2.3.jar
com/foo/bar/1.2.3/bar-1.2.3.pom
com/foo/blah/1.2.3/blah-1.2.3.jar
com/foo/blah/1.2.3/blah-1.2.3.pom
com/foo/blah/1.2.3/blah-1.2.3-javadocs.jar
com/foo/blah/1.2.3/blah-1.2.3-sources.jar
com/foo/blah/1.2.3-SNAPSHOT/blah-1.2.3-SNAPSHOT.jar
com/foo/blah/1.2.3-SNAPSHOT/blah-1.2.3-SNAPSHOT.pom
com/foo/blah/1.2.3-SNAPSHOT/blah-1.2.3-SNAPSHOT-javadocs.jar
com/foo/blah/1.2.3-SNAPSHOT/blah-1.2.3-SNAPSHOT-sources.jar
com/foo/myapp/user-management/1.2.3/user-management-1.2.3.jar
com/foo/myapp/user-management/1.2.3/user-management-1.2.3.pom

我需要使用grep(因为我在存储库中有大量文件列表)找到任何匹配的无效路径,以便进行以下操作:

com/foo/bar/1.2.3/blah.jar        {notice how:
                                   a) the artifactId is not part of the file name;
                                   b) there is no specified version

                                   In this case com/foo would be the groupId,
                                   but blah is not the artifactId
                                   and there is no version
                                  }
blah/1.zip                        {notice how there is no:
                                   a) artifactId
                                   b) version component of the path
                                  }

以上说明了不遵循开头解释的Maven格式的情况。

2 个答案:

答案 0 :(得分:2)

你可以尝试:

^(?![\w\/]*\/(\w+)\/([\w-]+)\/([\d.]+)\/\2-\3(-\w+)?\.(\w+)).*$

它会在不同的组中捕获不同的部分,并验证所需的部分是否存在。

See it here at regex101

修改

错过了您对匹配感兴趣的事实。更改了正则表达式和示例。

答案 1 :(得分:2)

我不确定您为何尝试将文件名与grep匹配。但是这里是find命令来查找所有不匹配的文件:

find . -type f ! -regex '.*/\([^/]*\)/\([^/]*\)/\1-\2[^/]*'

我只匹配artifactIdversion,因为您还没有准确指定任何其他内容(显然甚至没有强制.jar扩展名blah/1.zip }不会将.zip列为错误))。

要删除有问题的文件,只需将-delete添加到find调用中:

find . -type f ! -regex '.*/\([^/]*\)/\([^/]*\)/\1-\2[^/]*' -delete

Edit1:grep的相同正则表达式:

egrep -v '^.*/([^/]*)/([^/]*)/\1-\2[^/]*$'