正则表达式用于类似 Maven 工件的路径



我正在尝试为以下情况提出一个正则表达式...

我们正在清理一些错误地部署到存储库的 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 格式的情况。

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

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

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

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

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

编辑1:grep的相同正则表达式:

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

你可以试试:

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

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

在 regex101 上看到它。

编辑:

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

相关内容

  • 没有找到相关文章

最新更新