【问题标题】:Extract substring using two delimiters and NO REGEX使用两个分隔符提取子字符串并且没有正则表达式
【发布时间】:2018-07-23 12:09:12
【问题描述】:

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

我有一个更简单、更优雅的解决方案,它只有一行,但我终生无法记住或找到它。

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 基本功能并且没有正则表达式。

【问题讨论】:

  • 听听为什么不能使用正则表达式会很有趣?
  • 我被提供的原因: - 这些函数所在的脚本正在解析非常大的文件 - 这个函数非常常用 - 在这种情况下,使用没有正则表达式的函数会更快
  • 我不确定 substr + 2 倍 index 是否比正则表达式匹配操作快。你可以做一个基准来检查它是否真的更快
  • 这也是我的想法;基准确实证明是正确的。我不记得具体细节了,但虽然它并没有快几英里,但至少明显快得多(我们说的是一分钟内的秒数)。这就是说,在这种情况下,我确实觉得相关性并不意味着因果关系,从我与软件工程师朋友的讨论中,他们都对这个结果感到惊讶。
  • 我运行了benchmark,似乎substr + index 通常比正则表达式匹配更快,但并非适用于所有情况。如果您想进一步提高速度,还可以考虑在 C 中实现 findBetween()

标签: perl split substring


【解决方案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

【讨论】:

    【解决方案2】:

    我会简单地使用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

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

    【讨论】:

    • 我明白你在说什么;这里的问题是我希望它返回子字符串但是我不知道子字符串,我知道分隔符。因此,在您的示例中,它将是:“hello”和“world”
    • 然后简单地循环索引以查找分隔符并根据位置打印子字符串。
    • 是的,我知道它是如何工作的;但是我记得我找到了一个解决方案,该解决方案仅包含两个完美运行的功能。
    • 必须是正则表达式或者可能是 sed。
    • 我明白你的意思,如果我没有看到这个解决方案,我会倾向于全心全意地同意你的意见。如果找到它,我一定会更新。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2019-07-02
    • 1970-01-01
    • 2017-02-10
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-04-14
    相关资源
    最近更新 更多