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

时间:2015-05-10 16:02:39

标签: regex perl

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

@Html.PasswordFor(model => model.Password, new { @placeholder = "请输入密码", @class = "ipt ipt-login ipt-passwordforJS", @required = "required" })

我想在第3个/skukke/integration/build/IO/something 字符后提取所有内容。在这种情况下,输出应为

/

我试过这样的事情

/build/IO/something

比赛结果是

/\/\s*([^\\]*)\s*$/

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

2 个答案:

答案 0 :(得分:2)

正则表达式解决方案

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

(?:\/[^\/]+){2}(.*)

请参阅demo

正则表达式解释:

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

以下是TutorialsPoint的演示:

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

输出:

/build/IO/something

非正则表达式解决方案

您可以使用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;

输出/build/IO/something

请参阅demo on Ideone

答案 1 :(得分:0)

使用此正则表达式:

my $string = "/skukke/integration/build/IO/something";
$string =~ s/\/[a-zA-Z0-9]*\/[a-zA-Z0-9]*//;

希望这有帮助。