正则表达式以匹配字符串的结尾并捕获字符串perl之前的部分

时间:2019-01-18 22:31:43

标签: regex string perl

我正在尝试将任何字符串与以/结尾的正则表达式进行匹配。并提取/?之前的字符串

下面是我的代码:

$input = "boringinterestingboring/?";
if($input =~ /(.*)\/?$/) {
    print "$1\n";
}
else {
    print "not matched";
}

我正在尝试使用"boringinterestingboring"捕获(.*),但是它没有这样做,而是捕获了整个字符串。

我应该只获取/之前的字符串。

请帮助。

3 个答案:

答案 0 :(得分:2)

要匹配所有(但不包括/?):

.*(?=/\?)

如果不确定转义,可以使用字符类为您转义:

.*(?=/[?])

答案 1 :(得分:1)

它似乎是重复的,但作为您问题的答案,
您的正则表达式必须为:

/(.*)\/\?$/

/(.*)(?=\/\?$)/

示例:

$input = "boringinterestingboring/?";
print "Use \$1: $1\n" if($input =~ /(.*)\/\?$/);
print "Use \$1: $1\n" if($input =~ /(.*)(?=\/\?$)/);
print "Use \$&: $&\n" if($input =~ /.*(?=\/\?$)/);

输出:

Use $1: boringinterestingboring
Use $1: boringinterestingboring
Use $&: boringinterestingboring

不同的方式,相同的目的地。但是无论哪种方式,您也应该转义?,或将其放在[]中。

答案 2 :(得分:0)

使用积极的前瞻性。断言(?=..)将与/?匹配,但是即使嵌套在另一个组中也不会使其成为捕获组的一部分。

$ echo "boringinterestingboring/?" | perl -ne ' ($x)=/(boringinterestingboring(?=\/\?))/ ; print $x '
boringinterestingboring
$

否定测试用例。下面什么也没打印

$ echo "boringinterestingboring#?" | perl -ne ' ($x)=/(boringinterestingboring(?=\/\?))/ ; print $x '

$