提取两个点之间的字符串

Naz*_*zar 6 regex perl

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

word1.word2.word3
Run Code Online (Sandbox Code Playgroud)

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

@perleval $vars{sub} = $vars{string} =~ /.(.*)./; 0@
Run Code Online (Sandbox Code Playgroud)

编辑:

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

@perleval $vars{sub} = $vars{string} ; 0@
Run Code Online (Sandbox Code Playgroud)

将word1.word2.word3分配给变量sub

ike*_*ami 5

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

您可以使用以下任意一种:

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

$vars{sub} = ( $vars{string} =~ /\.([^.]*)\./ )[0];
Run Code Online (Sandbox Code Playgroud)

( $vars{sub} ) = $vars{string} =~ /\.([^.]*)\./;
Run Code Online (Sandbox Code Playgroud)

第一个允许您在没有匹配项时提供默认值。


sni*_*erd 3

尝试:

/\.([^\.]+)\./
Run Code Online (Sandbox Code Playgroud)

。具有特殊含义,需要转义。然后,您可能希望捕获点之间的值,因此请使用负字符类,例如 ([^\.]+) ,表示至少一个非点。如果你使用 (.*) 你会得到:

word1.stuff1.stuff2.stuff3.word2 结果:

stuff1.stuff2.stuff3
Run Code Online (Sandbox Code Playgroud)

但也许你想要那个?

这是我的小例子,我确实发现 perl one 衬垫有时有点难以阅读,所以我将其分解:

use strict;
use warnings;

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

结果

stuff2
Run Code Online (Sandbox Code Playgroud)