Perl正则表达式匹配子字符串

swa*_*kke 5 regex perl

我有几个要从中提取子字符串的字符串。这是一个例子:

/skukke/integration/build/IO/something
Run Code Online (Sandbox Code Playgroud)

我想提取第三个/字符之后的所有内容。在这种情况下,输出应为

/build/IO/something
Run Code Online (Sandbox Code Playgroud)

我尝试过这样的事情

/\/\s*([^\\]*)\s*$/
Run Code Online (Sandbox Code Playgroud)

比赛的结果是

something
Run Code Online (Sandbox Code Playgroud)

这不是我想要的。有人可以帮忙吗?

Wik*_*żew 2

正则表达式解决方案

您可以使用的正则表达式是:

(?:\/[^\/]+){2}(.*)
Run Code Online (Sandbox Code Playgroud)

查看演示

正则表达式解释:

  • (?:\/[^\/]+){2}- 精确匹配 2 次/以及所有不是/1 次或多次的内容
  • (.*)- 在我们之前匹配的字符之后匹配 0 个或多个字符,并将其放入捕获组 1。

这是TutorialsPoint上的演示:

$str = "/skukke/integration/build/IO/something";
print $str =~ /(?:\/[^\/]+){2}(.*)/;
Run Code Online (Sandbox Code Playgroud)

输出:

/build/IO/something
Run Code Online (Sandbox Code Playgroud)

非正则表达式解决方案

您可以使用File::Spec::Functions

#!/usr/bin/perl
use File::Spec;
$parentPath = "/skukke/integration";
$filePath = "/skukke/integration/build/IO/something";
my $relativePath = File::Spec->abs2rel ($filePath,  $parentPath);
print "/". $relativePath;
Run Code Online (Sandbox Code Playgroud)

输出/build/IO/something

请参阅Ideone 上的演示