Регулярное выражение Javascript для сопоставления/извлечения расширения файла
Следующее регулярное выражение
var patt1=/[0-9a-z]+$/i;
извлекает расширение файла строк, например
filename-jpg
filename#gif
filename.png
Как изменить это регулярное выражение только для возврата расширения, когда строка действительно является именем файла с одной точкой в качестве разделителя? (Очевидно, имя файла # gif не является обычным именем файла)
ОБНОВЛЕНИЕ На основании комментариев tvanofsson я хотел бы пояснить, что, когда функция JS получает строку, строка уже будет содержать имя файла без пробелов без точек и других специальных символов (на самом деле будет обрабатываться a slug
). Проблема заключалась не в разборе имен файлов, а при неправильном анализе пули - функция возвращала расширение "jpg", когда ему давали "filename-jpg", когда он должен действительно возвращать null
или пустую строку, и именно такое поведение необходимо для исправления.
Ответы
Ответ 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
тестовая страница.