【问题标题】:Extract string after a symbol in Perl在 Perl 中提取符号后的字符串
【发布时间】:2016-01-18 21:45:54
【问题描述】:

如何在 Perl 中提取符号后的字符串?

我尝试进行一些搜索,但即使我找到的代码也不起作用。

我正在尝试提取冒号后的字符串。所以我想在冒号之后显示所有内容。

例子:

string = day1: string over here

substring = string over here

到目前为止我已经尝试过:

$substring = $string=~ /(\:.*)\s*$/;

但它只会一遍又一遍地输出数字1。

【问题讨论】:

  • 正则表达式应该是/:\s*(.*)\s*$/

标签: regex string perl split


【解决方案1】:

这是因为标量上下文中的模式匹配是布尔测试。如果要捕获括号内容(捕获组),则需要一个列表上下文。如果列表只有一个元素也没关系:

试试这个:

 my ( $substring ) = $string=~ /(\:.*)\s*$/;

差异可能有点微妙,但基本上 - 我们将模式匹配中的“所有命中”分配给一个列表......它包含一个元素。

注意 - 你可以这样做:

my @matches = $string =~ m/(.)/g; 

并返回多个“命中”。如果你按照上面的方法做,你只会得到第一个匹配 - 这与你的模式无关,但你可以这样做:

my ( $key, $value ) = $string =~ m/(\w+)=(\w+)/; 

例如。

【讨论】:

    【解决方案2】:

    我通常使用括号从文本中提取一部分,然后引用存储在 $1 变量中的结果。

    看例子:

    my $text = "day1: string over here";
    
    print $1 if ($text =~ /:\s*(.+)$/);
    

    但使用此代码也可能会收到类似的结果:

    my $text = "day1: string over here"; 
    
    my ($a) = $text =~ /:\s*(.+)$/;
    print $a;
    

    【讨论】:

      【解决方案3】:

      您也可以使用split 函数来实现欲望子串:

      #!/usr/bin/perl
      use warnings;
      use strict;
      
      my $string = "day1: string over here";
      
      my (undef, $substring) = split(':\s*', $string);
      
      print $substring, "\n";
      

      输出:

      string over here
      

      或者您可以通过在正则表达式中使用捕获组() 来获得:

      my $string = "day1: string over here";
      $string =~ m/(.*)\:\s+(.*)$/;
      my $substring = $2;
      print $substring, "\n";
      

      【讨论】:

      • 我不清楚你为什么在正则表达式示例中捕获两个组,然后忽略其中一个。
      • OP想提取冒号后面的字符串,所以我忽略了第一个。
      • 同意。但是你可以完全省略前导的(.*),直接访问$1。还是我错过了什么?
      • 我想向 OP 展示第一部分在哪里以及捕获组如何工作,所以我没有省略前导部分。
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2018-02-12
      • 1970-01-01
      • 2010-11-29
      • 1970-01-01
      • 2012-07-15
      相关资源
      最近更新 更多