15

存在する場合、URLからファイル名を取得する正規表現を作成しようとしています。

これは私がこれまでに持っているものです:

(?:[^/][\d\w\.]+)+$

したがって、URLから、http://www.foo.com/bar/baz/filename.jpg一致する必要がありますfilename.jpg

残念ながら、最後の/.

ファイル名のように見える場合にのみ取得できるようにするにはどうすればよいですか?

4

13 に答える 13

37

上記の例では、次の URL からファイル名「file-1.name.zip」を取得できません。

"http://sub.domain.com/sub/sub/handler?file=data/file-1.name.zip&v=1"

そこで、REGEX バージョンを作成しました。

[^/\\&\?]+\.\w{3,4}(?=([\?&].*$|$))

説明:

[^/\\&\?]+          # file name - group of chars without URL delimiters
\.\w{3,4}           # file extension - 3 or 4 word chars
(?=([\?&].*$|$))    # positive lookahead to ensure that file name is at the end of string or there is some QueryString parameters, that needs to be ignored
于 2014-10-08T09:05:02.523 に答える
11

非プリクレ

(?:[^/][\d\w\.]+)$(?<=\.\w{3,4})

プクレ

(?:[^/][\d\w\.]+)$(?<=(?:.jpg)|(?:.pdf)|(?:.gif)|(?:.jpeg)|(more_extension))

デモ

regexpal.comjavascript に基づいている (後読みをサポートしていない) を使用してテストするので、代わりにこれを試してください。

(?=\w+\.\w{3,4}$).+
于 2013-01-23T09:07:29.557 に答える
11
(?:.+\/)(.+)

最後のスラッシュ (/) までをすべて選択し、このスラッシュ以降をすべてキャプチャします。サブパターン $1 を使用します。

于 2015-05-05T20:58:37.497 に答える
8

私はこれを使用しています:

(?<=\/)[^\/\?#]+(?=[^\/]*$)

説明:

(?<=): 文字列にこの式が含まれているが、一致していないことを主張する肯定的な後読み。

(?<=/): リテラル スラッシュ "/" の肯定的な後読み。これは、前にあるがスラッシュと一致しない式を探していることを意味します。

[^/\?#]+: 「/」でも「?」でもない 1 つ以上の文字 または「#」、検索パラメーターとハッシュを削除します。

(?=[^/]*$): スラッシュに一致しないものを前向きに見てから、行末に一致します。これは、最後のスラッシュ セグメントが確実に選択されるようにするためです。

使用例:

const urlFileNameRegEx = /(?<=\/)[^\/\?#]+(?=[^\/]*$)/;

const testCases = [
  "https://developer.mozilla.org/en-US/docs/Web/API/MutationObserverInit#yo",
  "https://developer.mozilla.org/static/fonts/locales/ZillaSlab-Regular.subset.bbc33fb47cf6.woff2",
  "https://developer.mozilla.org/static/build/styles/locale-en-US.520ecdcaef8c.css?is-nice=true"
];

testCases.forEach(testStr => console.log(`The file of ${testStr} is ${urlFileNameRegEx.exec(testStr)[0]}`))

于 2019-05-22T13:37:39.600 に答える
2

それもうまくいくかもしれません:

(\w+\.)+\w+$
于 2013-01-23T06:05:07.690 に答える
1

区切り文字がどのように見えるかを知っているので、正規表現は必要ありません。ちょうどsplit文字列。言語について言及していないので、Perl での実装を次に示します。

use strict;
use warnings;

my $url = "http://www.foo.com/bar/baz/filename.jpg";
my @url_parts = split/\//,$url;

my $filename = $url_parts[-1];

if(index($filename,".") > 0 )
{
    print "It appears as though we have a filename of $filename.\n";
}
else
{
    print "It seems as though the end of the URL ($filename) is not a filename.\n";
}

もちろん、特定のファイル拡張子 (png、jpg、html など) を気にする必要がある場合は、適切に調整してください。

于 2013-01-23T09:10:16.083 に答える
0

JavaScript を使用すると仮定すると、次のようになります。

        var fn=window.location.href.match(/([^/])+/g);
        fn = fn[fn.length-1]; // get the last element of the array
        alert(fn.substring(0,fn.indexOf('.')));//alerts the filename
于 2013-01-23T11:24:40.793 に答える
0
> echo "http://www.foo.com/bar/baz/filename.jpg" | sed 's/.*\/\([^\/]*\..*\)$/\1/g'
filename.jpg
于 2013-01-23T09:41:46.750 に答える
-1

代わりにこれを試してください:

(?:[^/]*+)$(?<=\..*)
于 2013-07-07T12:40:46.297 に答える