Подтвердить что ты не робот

Регулярное выражение Javascript для сопоставления/извлечения расширения файла

Следующее регулярное выражение

var patt1=/[0-9a-z]+$/i;

извлекает расширение файла строк, например

filename-jpg
filename#gif
filename.png

Как изменить это регулярное выражение только для возврата расширения, когда строка действительно является именем файла с одной точкой в ​​качестве разделителя? (Очевидно, имя файла # gif не является обычным именем файла)

ОБНОВЛЕНИЕ На основании комментариев tvanofsson я хотел бы пояснить, что, когда функция JS получает строку, строка уже будет содержать имя файла без пробелов без точек и других специальных символов (на самом деле будет обрабатываться a slug). Проблема заключалась не в разборе имен файлов, а при неправильном анализе пули - функция возвращала расширение "jpg", когда ему давали "filename-jpg", когда он должен действительно возвращать null или пустую строку, и именно такое поведение необходимо для исправления.

4b9b3361

Ответ 1

Просто добавьте . в регулярное выражение

var patt1=/\.[0-9a-z]+$/i;

Поскольку точка является специальным символом в регулярном выражении, вам нужно убежать от нее в буквальном смысле: \..

Теперь ваш шаблон будет соответствовать любой строке, которая заканчивается точкой, за которой следует хотя бы один символ из [0-9a-z].

например.

foobar.a
foobar.txt
foobar.foobar1234

если вы хотите ограничить расширение определенным количеством символов, чем вам нужно заменить +

var patt1=/\.[0-9a-z]{1,5}$/i;

позволит по крайней мере 1 и не более 5 символов после точки.

Ответ 2

Try

var patt1 = /\.([0-9a-z]+)(?:[\?#]|$)/i;

Этот RegExp полезен для извлечения расширений файлов из URL-адресов - даже те, у которых есть строки запроса ?foo=1 и #hash.

Он также предоставит вам расширение как $1.

var m1 = ("filename-jpg").match(patt1);
alert(m1);  // null

var m2 = ("filename#gif").match(patt1);
alert(m2);  // null

var m3 = ("filename.png").match(patt1);
alert(m3);  // [".png", "png"]

var m4 = ("filename.txt?foo=1").match(patt1);
alert(m4);  // [".txt?", "txt"]

var m5 = ("filename.html#hash").match(patt1);
alert(m5);  // [".html#", "html"]

P.S. +1 для @stema, который предлагает довольно хороший совет на некоторых основах синтаксиса RegExp.

Ответ 3

Пример списка:

var fileExtensionPatter = /\.([0-9a-z]+)(?=[?#])|(\.)(?:[\w]+)$/gmi
//regex flags -- Global, Multiline, Insensitive

var ma1 = 'css/global.css?v=1.2'.match(fileExtensionPatter)[0];
console.log(ma1);
// returns .css

var ma2 = 'index.html?a=param'.match(fileExtensionPatter)[0];
console.log(ma2);
// returns .html

var ma3 = 'default.aspx?'.match(fileExtensionPatter)[0];
console.log(ma3);
// returns .aspx

var ma4 = 'pages.jsp#firstTab'.match(fileExtensionPatter)[0];
console.log(ma4);
// returns .jsp

var ma5 = 'jquery.min.js'.match(fileExtensionPatter)[0];
console.log(ma5);
// returns .js

var ma6 = 'file.123'.match(fileExtensionPatter)[0];
console.log(ma6);
// returns .123

тестовая страница.