如何从此字符串中提取子字符串?

时间:2010-10-27 17:14:55

标签: perl

我有一个类似于/somedir/ref/some-dir/foo.word

的字符串

如何从上面的字符串中提取foo?包括foo在内的整个字符串可能会有所不同,但结构总是相同的。它总是最后一个斜线和最后一个点之间的字母。

6 个答案:

答案 0 :(得分:12)

看起来你正试图从完全限定的文件路径中找到文件名(没有扩展名)。如果是这种情况,请查看File::Basename核心模块:

my $str = "/somedir/ref/some-dir/foo.word";
my( $filename, $directory, $suffix ) = fileparse($str, qr/\.[^.]*/);

fileparse()方法有两个参数:要解析的字符串和要删除的文件后缀。如果您事先不知道文件后缀是什么,那么您可以提供正则表达式。在这种情况下,后缀将匹配一个句点,后跟零个或多个非句号字符。

修改如果您没有找到文件名,并想要在最后/和最后.之间使用字母,请尝试以下操作:

my $str = "/somedir/ref/some-dir/foo.word";
my @elems1 = split '/', $str;
my @elems2 = split '\.', $elems1[-1];
my $foo = $elems2[-2];

TIMTOWTDI! : - )

答案 1 :(得分:0)

试试这个

s/.*\/([^.]*)\..*/$1/g

答案 2 :(得分:0)

尝试

if ($str =~ /\/([^\/]+)\.[^\/]*?$/) {
    $foo = $1; # This is the word 'foo' in your test case.
} else {
    die("Error matching string");
}

演示(使用Ruby,但正则表达式在两种语言中都是相同的):http://www.rubular.com/r/7FUeFFV4QI

编辑:修正了错误

答案 3 :(得分:0)

#!/usr/bin/perl

use strict; use warnings;

my $s = '/somedir/ref/some-dir/foo.word';

if ( my ($x) = $s =~ m{/(\w+)\.\w+\z} ) {
    print "$x\n";
}

答案 4 :(得分:-1)

my ($foo) = $str =~ m|/(\w+)[^/]+$|;

假设“foo”部分可以包含任何“单词”字符(字母数字加下划线)。

答案 5 :(得分:-1)

$str =~ m/\/(\w+)\./

foo将存储在perl中的特殊$ 1变量中。 如果你想在分配它之后将它放在一个普通变量中。

$myvar = $1;

这是目前为止列出的最简单的解决方案。

这将提取“/”和“。”之间的任何单词字符串。在输入中。除非字符串中有多个句点要匹配,否则它始终是您想要的单词。但我假设“。”将只在最后(如在文件扩展名上)。