Я работаю с приложением VueJS, которое принимает входные данные поиска, а затем я собираюсь запрашивать различные API на основе термина. Мое первое регулярное выражение должно совпадать только с числами до 7 цифр. Тем не менее, он соответствует чему угодно.
Я предполагаю, что debounce и оператор switch/case вызывают некоторую путаницу, но я не уверен.
В конце концов, мне понадобится 6 или 7 различных тестов регулярных выражений, которые я буду проверять, поэтому мне нужно заставить это работать.
Кто-нибудь знает, что я делаю неправильно?
Пример JS:
Vue.component("v-select", VueSelect.VueSelect);
new Vue({
el: "#app",
data: {
options: []
},
methods: {
onSearch(search, loading) {
loading(true);
this.search(loading, search, this);
},
search: _.debounce((loading, search, vm) => {
console.info('search term is '+ search);
var regex1 = /([0-9]){0,7}/;
switch(true){
case regex1.test(search):
console.info('we have a number '+ search);
break;
default:
console.info('default case '+ search);
fetch(`https://api.github.com/search/repositories?q=${escape(search)}`).then(res => {
res.json().then(json => (vm.options = json.items));
loading(false);
});
break;
};
}, 350)
}
});
Пример кода:
https://codepen.io/thindery/pen/xeqBGx?editors=1010
Консоль показывает вывод. Попробуйте выполнить поиск по обычному слову, например «vue» или «library». По какой-то причине они запускают числовое регулярное выражение.
Действительно, /([0-9]){0,7}/
пропустит любую строку, потому что она допускает нулевые цифры без каких-либо ограничений на остальную часть строки.
Поэтому добавьте якоря ^
и $
к вашему регулярному выражению. Скобки не нужны, а \d
это [0-9]
:
/^\d{0,7}$/