2010-10-27 136 views
1

我有一個字符串,看起來像:/somedir/ref/some-dir/foo.word如何從這個字符串中提取一個子字符串?

我怎麼能從上面的字符串中提取foo?整個字符串,包括foo可能會有所不同,但是,結構總是相同的。它將始終是最後一個斜槓和最後一個點之間的字母。

+0

結構如何「相同」?你需要捕捉_last斜線_和_last點_之間的_letters_,或..? – mfontani 2010-10-27 17:20:40

+0

這是正確的,總是最後一個斜槓和最後一個點之間的字母。 – rplant23 2010-10-27 17:21:23

+0

太棒了!謝謝大家。 – rplant23 2010-10-27 17:26:45

回答

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! :-)

+0

你可能想要加入除@ @ elems2的最後一個元素以外的所有元素,而不僅僅是第二個元素。 – flies 2010-10-27 17:42:59

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

假定「foo」部分可以包含任何「字」字符(字母數字加下劃線)。

+3

這是不正確的,並且在給定的測試用例上不起作用。 – 2010-10-27 17:23:00

+0

我在發佈之前檢查過它。這個命令輸出「foo」:perl -le'my $ str =「/somedir/ref/some-dir/foo.word」;我($ foo)= $ str =〜m | /(\ w +)[^ /] + $ |; print $ foo' – Sean 2010-10-27 17:37:01

+1

要匹配的單詞可以是任何東西,所以\ w不能匹配例如:'foo-bar' – 2010-10-27 17:45:36

0

試試這個

s/.*\/([^.]*)\..*/$1/g 
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

編輯:修正了一個錯誤

+0

如果$ str與該正則表達式不匹配,那麼無論$ 1是否是最後一次成功的正則表達式匹配,您都將分配給$ foo。 – Sean 2010-10-27 17:42:03

+0

儘管你確實是對的,那真的值得讚賞嗎?固定在帖子中。 – 2010-10-28 16:39:16

+0

@Sean - 這根本不是問題,特別是因爲我們不知道OPs問題的性質。也許它甚至可能是DESIRABLE行爲,我知道我已經使用了一種類似於這種情況的情況,在當前情況失敗的情況下,我確實需要先前的值。我已經對這個錯誤的倒票投了贊成票。沒有有效的答案/代碼應該被低估爲恕我直言。 – gnomed 2010-10-28 18:22:52

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

foo將被存儲在perl中特殊的$ 1變量中。 如果你想在一個正常的變量分配它後。

$myvar = $1; 

這是迄今爲止列出的最簡單的解決方案。

這將提取「/」和「。」之間的任何字符串。在輸入中。它將永遠是你想要的單詞,除非字符串中有多個句點要匹配。但我假設「。」只會在最後(比如在文件擴展上)。

+0

風格改進:消除嘔吐副作用變量和傾斜牙籤。 '我的($結果)= $ str =〜m {/(\ w +)\。}; – daxim 2010-10-27 20:14:24

+0

奇怪爲什麼有人會投票完全有效的代碼來精確回答問題。 – gnomed 2010-10-28 18:12:58

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"; 
} 
相關問題