提取两个点之间的字符串

时间:2017-07-14 17:23:59

标签: regex perl

我有一个以下格式的字符串:

word1.word2.word3

在perl中从该字符串中提取 word2 的方法有哪些? 我尝试了以下表达式,但它将1分配给 sub

@perleval $vars{sub} = $vars{string} =~ /.(.*)./; 0@

修改

我已经尝试了几个建议,但仍然得到值1.我怀疑上面的整个表达式除了解析之外还有问题。但是,当我做简单的任务时,我得到了正确的结果:

@perleval $vars{sub} = $vars{string} ; 0@

word1.word2.word3 分配给变量 sub

4 个答案:

答案 0 :(得分:3)

尝试:

/\.([^\.]+)\./

。有特殊意义,需要逃脱。然后你想要捕获点之间的值,所以使用像([^ \。] +)这样的负字符类,这意味着至少有一个非点。如果你使用(。*),你会得到:

word1.stuff1.stuff2.stuff3.word2导致:

stuff1.stuff2.stuff3

但也许你想要那个?

这是我的小例子,我确实发现perl one liners有时候难以阅读所以我把它分解出来:

use strict;
use warnings;

if ("stuff1.stuff2.stuff3" =~ m/\.([^.]+)\./) {
    my $value = $1;
    print $value;
}
else {
    print "no match";
}

结果

stuff2

答案 1 :(得分:3)

  • .在正则表达式中具有特殊含义,因此需要进行转义。
  • .*可能超出预期。 [^.]*更安全。
  • 匹配运算符(//)只在标量上下文中返回true / false。

您可以使用以下任何一项:

$vars{sub} = $vars{string} =~ /\.([^.]*)\./ ? $1 : undef;

$vars{sub} = ( $vars{string} =~ /\.([^.]*)\./ )[0];

($vars{sub}) = $vars{string} =~ /\.([^.]*)\./;

$vars{sub} = $vars{string} =~ /\.([^.]*)\./r;     # Requires Perl 5.14+

如果没有匹配,第一个允许您提供默认值。

答案 2 :(得分:1)

<div class="panel panel-default" > <div class="panel-heading"> {{title}} </div> <div class="panel-body" ng-style="loadingStyle"> <button class="btn btn-sm btn-default" ng-click="openDialog();" type="button">Open</button> </div> </div> 具有特殊含义:任何字符(请参阅括号之间的表达式)

因此,如果搜索文字点,则必须将其转义(.):

\.

答案 3 :(得分:0)

您必须确保在进行搜索时要求列表。

my $x= $string =~ /look for (pattern)/ ;

$x设为1

my ($x)= $string =~ /look for (pattern)/ ;

$x设置为模式。

相关问题