2014-10-20 4 views
0

Это должно быть довольно легко, но по какой-то причине это не так. Я пытаюсь сопоставить имена файлов шаблонов, которые могут содержать .-_ символов и всегда заканчиваются .html. Допустимые примеры:Regex для соответствия имени шаблона

my-tem-plate.html 
my.tem-plate.html 
my_tem.plate.html 

С моим текущим регулярным выражением:

/(\w|\.|\-|\_)+.html/ 

протестирован на пути с именем файла:

'/src/blabla/select-tab.tpl.html' 

Я получаю два матча в массиве, а не только один.

["select-tab.tpl.html", "l"] 

Любые идеи, как исправить это?

+1

попробуйте этот '^ [\ ш -.]. + \ HTML $', что языки вы работаете? –

+0

Операции 'OR' могут выполняться более простым и понятным с помощью' [\ w \. \ - \ _] + ' –

+2

* Может содержать * или * должен содержать *? –

ответ

1

Ваше выражение уже (вроде) рабочий: когда вы используете str.match(/regex/) в JavaScript возвращает массив, состоящий по

  • всего матча в качестве первого пункта
  • захваченных значений, следующих пунктов

В /(\w|\.|\-|\_)+.html/ вы используете группу захвата (...), второй элемент в вашем результате - это зафиксированное значение (здесь, последняя буква до .html).

Вы можете просто выбросить все, кроме первого элемента в вашем результирующем массиве, но так как вам не нужно, чтобы захватить это значение, в первую очередь, вы можете просто использовать вместо:

/[\w.-]+\.html/ 

Кроме того, , несколько комментариев:

  • для обозначения любого характера может быть использован в наборе символов используйте character class: [...] (обратите внимание на метасимволы разные есть)
  • \w ярлык для [0-9a-zA-Z_], нет необходимости добавлять подчеркивание вручную
Смежные вопросы