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