如何在最后一次出现子字符串之前得到这个词?

时间:2016-11-10 05:53:15

标签: 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 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类型?

3 个答案:

答案 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)

Explanation

Run the perl code here

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