我试图通过将正则表达式模式应用于整个字符串来获得所需的单词。
这是我的字符串:
Birla Sun Life Global Real Estate Fund - Retail Plan - Direct Plan - Growth Option
SBI GOLD FUND - DIRECT PLAN - DIVIDEND
我想获得Plan
Direct
类型
有时Plan
出现一次,有时两次,因此该模式必须适用于这两种情况。
这是我到目前为止所写的内容:
$pname = 'Birla Sun Life Global Real Estate Fund - Retail Plan - Direct Plan - Growth Option';
if ( $pname =~ / ([^\s]*) plan(?!^plan$)*/ig ) # regex to get plan type
{
$plan_type = $1;
}
print "$1";
但是它会提供输出Retail
而不是Direct
。
我该怎么办才能将Direct
作为Plan
类型?
答案 0 :(得分:1)
我认为你这是错误的做法。神奇的正则表达式(IMO)很少能解决问题。
为什么不在分隔符(split
)上尝试-
字段:
my $str = 'Birla Sun Life Global Real Estate Fund - Retail Plan - Direct Plan - Growth Option';
my ( $fund, $something, $type, $option ) = split /\s*-\s*/, $str;
print $type,"\n";
答案 1 :(得分:0)
试试这个:
(\w+)\s+Plan(?!.*Plan)
use strict;
my $str = 'Birla Sun Life Global Real Estate Fund - Retail Plan - Direct Plan - Growth Option\'; ';
my $regex = qr/(\w+)\s+Plan(?!.*Plan)/p;
if ( $str =~ /$regex/g ) {
print "$1";
}
答案 2 :(得分:-1)
要在字符串中获取 last 出现的任何内容,您可以使用贪婪匹配来启动正则表达式模式,该匹配消耗尽可能多的字符串
这是使用您自己的数据的解决方案。请注意,您的全局/g
修饰符充其量是多余的,而且实际上没有意义
我还添加了/x
修饰符,它允许我为模式添加无关紧要的空白区域,使其更具可读性。它对除了最微不足道的模式之外的所有模式都很有用
use strict;
use warnings 'all';
my $pname = 'Birla Sun Life Global Real Estate Fund - Retail Plan - Direct Plan - Growth Option';
my $plan_type;
if ( $pname =~ / .* \b (\w+) \s+ plan \b /ix ) {
$plan_type = $1;
}
print $plan_type // 'undef', "\n";
Direct