#javascript #regex
#javascript #регулярное выражение
Вопрос:
Я хочу использовать регулярное выражение для извлечения последнего слова из пути к файлу. Например, у меня есть: /xyz / blahblah / zzz /abc-blah/def-xyz-color.jpg
Я хочу извлечь «цвет» из пути. Цвет пути имеет другой синтаксис. Единственное, что является последовательным, это окончание, где оно всегда -color.jpg где цветом будет любое слово [a-z].
Есть ли элегантный способ сделать это?
Я был бы действительно признателен за любую помощь здесь. Спасибо
Комментарии:
1. Я хочу уточнить, что путь имеет любую длину, любой размер и имеет один или несколько дефисов. Единственное, что согласуется, это -color.jpg в конце, где «color» — это слово, которое я хочу извлечь. А color — это любое слово, не состоящее из цифр.
2. Привет, люди, я знаю, что иногда использование регулярных выражений не лучшая идея (синтаксический анализ HTML и т.д.), Но Иногда они сильно упрощают код (как в этом случае). И иногда они вам нужны (из-за требований или потому, что инструмент, который вы используете для проверки чего-либо, заставляет вас вводить регулярное выражение и т.д.), Так что мы должны продолжать говорить, почему регулярное выражение? или Почему бы не _это_ лучше, чем регулярное выражение? в случаях, когда это не имеет особого смысла?
Ответ №1:
Почему вы могли просто взять substring вместо использования regex?
var path=" /xyz/blahblah/zzz/abc-blah/def-xyz-color.jpg";
var lastHyphen = path.lastIndexOf("-");
var lastDot = path.lastIndexOf(".");
var extractedValue=path.substring(lastHyphen 1, lastDot);
более компактная версия будет
var extractedValue=path.substring(path.lastIndexOf("-") 1, path.lastIndexOf("."));
Ответ №2:
var matched = /-(w ).jpg/i.exec('/xyz/blahblah/zzz/abc-blah/def-xyz-color.jpg')[1];
Ответ №3:
Зачем использовать регулярное выражение?
var a = '/xyz/blahblah/zzz/abc-blah/def-xyz-color.jpg'
.split('/').pop()
.split('-').pop()
.split('.')[0];
console.log(a);
Комментарии:
1. хммм .. честно говоря, я думаю, что в этом случае я предпочитаю регулярное выражение. Для программиста, который знает регулярные выражения, чтение кода с простым регулярным выражением (для этой цели) было бы намного проще и читабельнее, чем все эти всплывающие окна и разбиения. Я имею в виду, в этом идея, не так ли? Вы всегда сможете внести некоторые изменения, чтобы избежать использования регулярных выражений 😉
2. Это работает! Но будет ли это работать для пути с любым количеством «/» или «-» между ними?
3. @oscar: Возможно, я предпочитаю использовать регулярное выражение только при абсолютной необходимости, поскольку это сопряжено с дополнительными накладными расходами (немного дороже, чем собственные строковые функции). И если вам нужна удобочитаемость, разделите его на несколько строк (без каламбура ;)) и это довольно легко выполнить.
4. @david: Да, это будет работать до тех пор, пока у вас есть формат
*-color.ext
. Любое число/
или-
, предшествующее этому, будет проигнорировано.
Ответ №4:
Как насчет
-(w ).jpg
?
Если вы не хотите жестко кодировать расширение, вы можете сделать:
-(w ).w b
Конечно, это будет соответствовать многим вещам, но я предполагаю, что текст, которому нужно соответствовать, будет URL 😉
Редактировать:
Оно будет соответствовать двум группам, и вам нужно взять только вторую, поэтому просто получите доступ к 1-му индексу:
var text = '/xyz/blahblah/zzz/abc-blah/def-xyz-color.jpg';
var pattern = /-(w ).w b/;
var match = pattern.exec(text);
alert(match[1]); // color
Или сделайте это в одной строке, как предложил @Ryan.
Комментарии:
1. спасибо, но у меня это не сработало. Оно вернуло мне две строки «-color.jpg «и «цвет».
2. @David То, что это дало вам, было двумя группами: полное совпадение и только цвет. Позвольте мне отредактировать его 😉
3. Понял. Спасибо Оскару. Я использовал Райана, но отредактированное вами было легче читать новичку вроде меня.
Ответ №5:
Почему бы просто
var path= "/xyz/blahblah/zzz/abc-blah/def-xyz-color.jpg";
/(?:([^-.] ?).[^.] ?$)/i.test(path);
var color = RegExp.$1;
alert(color);