Regex 如何获取子字符串最后一次出现之前的单词?

Regex 如何获取子字符串最后一次出现之前的单词?,regex,perl,regex-negation,Regex,Perl,Regex Negation,我试图通过对整个字符串应用正则表达式模式来获取所需的单词 这是我的字符串: Birla Sun Life Global Real Estate Fund - Retail Plan - Direct Plan - Growth Option SBI GOLD FUND - DIRECT PLAN - DIVIDEND 我想得到Plan类型,它是Direct 有时Plan出现一次,有时出现两次,因此该模式必须适用于这两种情况 以下是我到目前为止所写的内容: $pname = 'Birla Su

我试图通过对整个字符串应用正则表达式模式来获取所需的单词

这是我的字符串:

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

我应该怎么做才能获得作为
计划
类型的
直接

(\w+)\s+Plan(?!.*Plan)


我认为你走错了方向。神奇的正则表达式(IMO)很少是问题的正确解决方案

为什么不改为尝试在分隔符(
-
)上拆分字段:

要获取字符串中最后出现的任何内容,可以使用贪婪匹配启动正则表达式模式,该匹配会消耗尽可能多的字符串

这里有一个使用您自己的数据的解决方案。请注意,您的全局
/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";
输出
“直接的计划类型”是什么意思?您需要字符串中的哪个特定短语或单词?您是否试图在最后一次出现
计划
之前获取该单词?您是否尝试过?谢谢您的回答,但它对我不起作用,因为这里我给出了一个示例,但我还有一些其他字符串,其中计划是一次性的,所以我需要reg ex,它在计划前给出一个字符串,但计划应该是整个单词的右侧,请再次查看我编辑的问题…你需要更好地解释业务,其他任何人都无法帮助你。。。你想要在计划最后一次出现之前的文本吗?是的,我需要在计划最后一次出现之前的文本plan@Sanket现在试试again@Sanket:您尚未接受任何问题的答案。请看。我不太确定总是有四个字段!
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";
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