Как извлечь подстроку из этой строки? - PullRequest
1 голос
/ 27 октября 2010

У меня есть строка, которая выглядит следующим образом: /somedir/ref/some-dir/foo.word

Как я могу извлечь foo из приведенной выше строки?Вся строка, включая foo, может различаться, однако структура всегда одинакова.Это всегда будут буквы между последней косой чертой и последней точкой.

Ответы [ 6 ]

12 голосов
/ 27 октября 2010

Похоже, вы пытаетесь найти имя файла (без расширения) по полному пути к файлу. Если это так, посмотрите на основной модуль 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! : -)

0 голосов
/ 27 октября 2010
#!/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";
}
0 голосов
/ 27 октября 2010
$str =~ m/\/(\w+)\./

foo будет храниться в специальной переменной $ 1 в perl.Если вы хотите, чтобы оно было в обычной переменной, просто назначьте его.

$myvar = $1;

Это, пожалуй, самое простое решение из перечисленных.

Это извлечет любую строку слова между "/" и "«.на входе.Это всегда будет слово, которое вы хотите, если только в строке нет нескольких точек для сравнения.Но я предполагаю "."будет только в конце (как в расширении файла).

0 голосов
/ 27 октября 2010

Попробуйте

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

Редактировать: Исправлена ​​ошибка

0 голосов
/ 27 октября 2010

попробуйте

s/.*\/([^.]*)\..*/$1/g
0 голосов
/ 27 октября 2010
my ($foo) = $str =~ m|/(\w+)[^/]+$|;

Предполагается, что часть "foo" может состоять из любых символов "слова" (буквенно-цифровой плюс подчеркивание).

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...