【问题标题】:Finding a text in a string在字符串中查找文本
【发布时间】:2014-04-22 07:20:04
【问题描述】:

我有一个字符串如下:

$var = "ABC/type.xml/BYB?not=1234&at=6789&xyz&LMN";

我想获得 not 和 at 值。如何使用它?

【问题讨论】:

标签: regex perl


【解决方案1】:

您可以并且可能应该使用可以正确解析此字符串的适当模块,例如URIURI::QueryParam

use strict;
use warnings;
use URI;
use URI::QueryParam;

my $str = "ABC/type.xml/BYB?not=1234&at=6789&xyz&LMN";
my $url = URI->new($str);
my $not = $url->query_param('not');
my $at  = $url->query_param('at');
print Dumper $not, $at;

输出:

$VAR1 = '1234';
$VAR2 = '6789';

【讨论】:

    【解决方案2】:

    最简单的事情可能是一次性将所有值提取到哈希中:

    my $var = "ABC/type.xml/BYB?not=1234&at=6789&xyz&LMN";
    
    my %values = $var =~ /(\w+)(?:=(.*?))?(?:&|\Z)/g;
    

    在这之后,你有

      DB<5> x \%values
    0  HASH(0x7fa133018f98)
       'LMN' => undef
       'at' => 6789
       'not' => 1234
       'xyz' => undef
    

    【讨论】:

    • 不知道组进入散列能力。有趣的线。
    【解决方案3】:

    您可以尝试使用正则表达式来提取匹配项:

    my $var = "ABC/type.xml/BYB?not=1234&at=6789&xyz&LMN";
    
    $var=~/not=(.*?)&/;
    my $a=$1;
    $var=~/at=(.*?)&/;
    my $b=$1;
    
    say $a,",",$b;
    

    输出:

    1234,6789
    

    【讨论】:

    • 哇容易多了..谢谢.. :)
    • 要考虑的一点是将\b 放在您尝试匹配的键之前,这样您在查找at 时就不会意外匹配cat=4&amp;。所以你会说$var=~/\bat=(.*?)&amp;/;
    猜你喜欢
    • 1970-01-01
    • 2015-07-14
    • 2016-11-14
    • 2016-03-31
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多