У меня есть массив строк, как показано ниже,
const arr = [
"list-domain/1/",
"list-domain/1/list/1",
"some-group/2/",
"some-group/2/list/2",
"list/3/",
"list/3/item/1"
];
Как видно из приведенного выше массива, я хочу проверить, содержит ли массив строки типа
"list-domain/1/" or "some-group/2/" or "list/3/"
Здесь числа после / могут быть любыми. значение в «list-domain/1» здесь 1 может быть 2 или 3 любым числом, которое я должен проверить, содержит ли строка список-домен или некоторую группу или список, за которым следует / и любое число, за которым следует /
Поэтому для приведенного выше массива ожидаемый результат верен.
Теперь рассмотрим массив ниже,
const arr1 = [
"list-domain/1/list/1",
"some-group/2/list/2",
"list/3/item/1"
];
Для arr1 ожидаемый вывод ложный, хотя есть строки list-domain/1, some-group/2 и list/3, но за ними следуют и другие строки, такие как list-domain/1/list/1, some-group/2 /список/2, список/3/элемент/1
Поэтому я хочу найти точные номера строк, которые могут быть любыми после /. может кто-нибудь помочь мне, как это сделать. благодаря.
РЕДАКТИРОВАТЬ:
Я хочу, чтобы он возвращал true, если строка имеет "list/1/" или
Любая строка, за которой следует «список/1», но возвращает false, если за «списком/1» следует другая строка, как показано ниже
"list-domain/1/list/1/item/1"
Верно в случаях ниже
"list-domain/1/list/1"
"list/2"
"some-group/3/list/3"
3 ответа
Это дает вам требуемый результат с использованием регулярного выражения (RegExp):
arr.some(a=> new RegExp(/^(list-domain|some-group|list)\/[0-9]+\/$/g).test(a))
map
и сделать его: arr.some(a => new RegExp(...).test(a))
arr.map(a=> new RegExp(/^(list-domain|some-group|list)\/[0-9]+(\/list\/[0-9]+)?\/$/g).test(a))
arr1.some(a=> new RegExp(/\/item\/[0-9]+\/$/g).test(a));
это может быть то, что вы хотите иметь.
Если вы можете рассчитывать на то, что форма шаблона всегда представляет собой строковый идентификатор, за которым следует числовой идентификатор, синтаксический анализатор может выглядеть следующим образом:
const arr = [
"list-domain/1/",
"list-domain/1/list/1",
"some-group/2/",
"some-group/2/list/2",
"list/3/",
"list/3/item/1"
];
const parse = (str) => {
const parts = str.split('/');
return parts.reduce((parsed, part, i, parts) => {
if (part === '') return parsed;
if (i % 2 === 0) {
parsed[part] = null;
} else {
parsed[parts[i-1]] = part;
}
return parsed;
}, {});
}
arr.forEach(s => {
console.log(parse(s));
})
// returns:
// {list-domain: "1"}
// {list-domain: "1", list: "1"}
// {some-group: "2"}
// {some-group: "2", list: "2"}
// {list: "3"}
// {list: "3", item: "1"}
Он возвращает объект, где ключи — это строковые идентификаторы, а значения — числовые идентификаторы. Однако, как я уже сказал, он зависит от точной формы строки и регулярного изменения идентификатора и значения.
Используйте регулярное выражение. Вот пример.
const rx = /^(([^\/]+)\/(\d+)\/)+$/
// or without the groups
const rxNoGroups = /^([^\/]+\/\d+\/)+$/
const found = items.filter(it => rx.test(it))
Это регулярное выражение проверяет
- начало ввода
- без косой черты
- слэш
- число
- слэш
- конец ввода или следующая группа
Адаптируйте его к вашим потребностям. Я закодировал его таким образом, что ваши слова, не являющиеся числами, могут содержать числа, поэтому foo/2/bar3/4/
. Вы также можете ограничить количество повторений.
Вы также можете просто проверить, что строка заканчивается на /
.
Новые вопросы
javascript
По вопросам программирования на ECMAScript (JavaScript / JS) и его различных диалектах / реализациях (кроме ActionScript). Включите все соответствующие теги в свой вопрос; например, [node.js], [jquery], [json] и т. д.
"list-domain/1/"
или ввод будет выглядеть примерно так:["list-domain", "some-group", "list"]