我有一個字符串,看起來像:/somedir/ref/some-dir/foo.word
如何從這個字符串中提取一個子字符串?
我怎麼能從上面的字符串中提取foo
?整個字符串,包括foo
可能會有所不同,但是,結構總是相同的。它將始終是最後一個斜槓和最後一個點之間的字母。
我有一個字符串,看起來像:/somedir/ref/some-dir/foo.word
如何從這個字符串中提取一個子字符串?
我怎麼能從上面的字符串中提取foo
?整個字符串,包括foo
可能會有所不同,但是,結構總是相同的。它將始終是最後一個斜槓和最後一個點之間的字母。
它看起來像你試圖從完全合格的文件路徑找到文件名(沒有擴展名)。如果是這樣的話,再看看進入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! :-)
你可能想要加入除@ @ elems2的最後一個元素以外的所有元素,而不僅僅是第二個元素。 – flies 2010-10-27 17:42:59
my ($foo) = $str =~ m|/(\w+)[^/]+$|;
假定「foo」部分可以包含任何「字」字符(字母數字加下劃線)。
這是不正確的,並且在給定的測試用例上不起作用。 – 2010-10-27 17:23:00
我在發佈之前檢查過它。這個命令輸出「foo」:perl -le'my $ str =「/somedir/ref/some-dir/foo.word」;我($ foo)= $ str =〜m | /(\ w +)[^ /] + $ |; print $ foo' – Sean 2010-10-27 17:37:01
要匹配的單詞可以是任何東西,所以\ w不能匹配例如:'foo-bar' – 2010-10-27 17:45:36
試試這個
s/.*\/([^.]*)\..*/$1/g
嘗試
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
編輯:修正了一個錯誤
如果$ str與該正則表達式不匹配,那麼無論$ 1是否是最後一次成功的正則表達式匹配,您都將分配給$ foo。 – Sean 2010-10-27 17:42:03
儘管你確實是對的,那真的值得讚賞嗎?固定在帖子中。 – 2010-10-28 16:39:16
@Sean - 這根本不是問題,特別是因爲我們不知道OPs問題的性質。也許它甚至可能是DESIRABLE行爲,我知道我已經使用了一種類似於這種情況的情況,在當前情況失敗的情況下,我確實需要先前的值。我已經對這個錯誤的倒票投了贊成票。沒有有效的答案/代碼應該被低估爲恕我直言。 – gnomed 2010-10-28 18:22:52
$str =~ m/\/(\w+)\./
foo將被存儲在perl中特殊的$ 1變量中。 如果你想在一個正常的變量分配它後。
$myvar = $1;
這是迄今爲止列出的最簡單的解決方案。
這將提取「/」和「。」之間的任何字符串。在輸入中。它將永遠是你想要的單詞,除非字符串中有多個句點要匹配。但我假設「。」只會在最後(比如在文件擴展上)。
#!/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";
}
結構如何「相同」?你需要捕捉_last斜線_和_last點_之間的_letters_,或..? – mfontani 2010-10-27 17:20:40
這是正確的,總是最後一個斜槓和最後一個點之間的字母。 – rplant23 2010-10-27 17:21:23
太棒了!謝謝大家。 – rplant23 2010-10-27 17:26:45