使用两个分隔符和NO REGEX提取子字符串

时间:2018-02-13 07:22:07

标签: perl split substring

我有一个函数,其目的是提取在两个分隔符之间找到的子字符串。我会使用正则表达式,但在这种情况下,我有明确的指示不使用它们。

我有一个更简单,更优雅的解决方案,只有一行,但我不能为我的生活记住或找到它。

sub findBetween {

my ($theString,$delimiter1,$delimiter2) = (@_);
my $tmp = substr($theString, index($theString,$delimiter1)+length($delimiter1));
$tmp = substr($tmp, 0, index($tmp,$delimiter2));
return $tmp;}

感谢您查看此问题,我知道这是非常基本的,有点多余。我需要的是一个更简单的解决方案,涉及perl基本功能,没有正则表达式。

2 个答案:

答案 0 :(得分:1)

您可以使用两个index()调用来定位两个分隔符,并使用索引在它们之间提取字符串,

sub findBetween {

    my ($theString,$delimiter1,$delimiter2) = @_;

    my $i1 = index($theString, $delimiter1, 0) + length($delimiter1);
    my $i2 = index($theString, $delimiter2, $i1);

    return substr($theString, $i1, $i2-$i1);
}

print findBetween("111--2222~~333", "--", "~~"), "\n";

输出

2222

答案 1 :(得分:0)

我只想使用index

use strict;
use warnings;

my $string = "hello my world";
my $substr = "my";
    if (index($string, $substr) != -1) {
        print "$substr found in $string";
  } 

摘自perldoc

  

•索引STR,SUBSTR,POSITION

     

•索引STR,SUBSTR

     
    

索引函数在另一个字符串中搜索一个字符串,但没有完整正则表达式模式匹配的类似通配符的行为。它返回POS在POSITION时或之后第一次出现的SUBSTR的位置。如果省略POSITION,则从字符串的开头开始搜索。字符串开头之前或结束之后的POSITION分别被视为开头或结尾。 POSITION和返回值基于零。如果未找到子字符串,则索引返回-1。