Регулярное выражение Javascript — Как извлечь последнее слово перед путем к изображению

#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);