首页 > 解决方案 > 如何使 perl 正则表达式不贪心?

问题描述

我有这样的路径:

/nfs/usr/x86-64_linux71/gnua/4.0.0/features/com.asas.gnua.feature_4.0.0
/nfs/usr/x86-64_linux71/gnua/4.0.0/plugins/org.codehaus.jackson_1.0.0/META-INF
/nfs/usr/x86-64_linux71/gnua/4.0.0/configuration
/nfs/usr/x86-64_linux71/gnua/4.0.0/plugins/org.easymock_2.5.1
/nfs/usr/x86-64_linux71/gnua/4.0.0/features/org.eclipse.e4.rcp_1.6.100.v20180611-0422

我想构建一个正则表达式来捕捉这些路径gnua,第一组和4.0.0第二组也是如此。我试过了:

^\/nfs\/.*?\/.*?\_linux\d+\/(.*)?\/(.*)?\/.*?

但我得到gnua/4.0.0第一组和features第二组。我怎样才能让第一组gnua和第二组4.0.0在 Perl 中?换句话说,最后一个.*?应该是features/com.asas.gnua.feature_4.0.0.

标签: perl

解决方案


将问号移动到匹配的组中。

/^\/nfs\/.*?\/.*?\_linux\d+\/(.*?)\/(.*?)\/.*?/

更改分隔符可提高可读性:

m{^/nfs/.*?/.*?_linux\d+/(.*?)/(.*?)/.*?}

但使用([^/]*)通常比(.*?).


推荐阅读