我正在尝试将任何字符串与以/结尾的正则表达式进行匹配。并提取/?之前的字符串
下面是我的代码:
$input = "boringinterestingboring/?";
if($input =~ /(.*)\/?$/) {
print "$1\n";
}
else {
print "not matched";
}
我正在尝试使用"boringinterestingboring"
捕获(.*)
,但是它没有这样做,而是捕获了整个字符串。
我应该只获取/之前的字符串。
请帮助。
答案 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 '
$