Как бы вы просматривали строку и могли извлекать числа с помощью регулярных выражений?

#javascript #regex #database #web-scraping

#javascript #регулярное выражение #База данных #веб-очистка

Вопрос:

Поэтому мне понадобится проверка с помощью регулярных выражений для нескольких вещей. Имена могут выглядеть так, поэтому я бы искал строку имени ключа.

 name: 'Pop Icons #23 Paulie Pigeon Pinstripe Jersey NYCC'
 or 
name: 'Pop Marvel 80th 526 Captain Marvel / Mar-Vell First Appearance'
 or
name: 'Pop 2001: A Space Odyssey #823 Dr. Frank Poole' 
 or 
name: '389 Blue-Eyes White Dragon'
 or 
name: 'Pop Up Movie Town #05 Kevin with Up House'
 

в настоящее время у меня есть

 var numbers = /#[1-9]d*b/g;
var matchNumber = title.splitTitle.match(numbers);

return {
  number: matchNumber amp;amp; matchNumber[0],
  name: title.splitTitle,
  image: title.image,
};
 

Выше title имеет то, что называется splitTitle и image, поэтому его объект выглядит следующим образом

 title: {
  splitTitle: 'Pop Marvel 80th 526 Captain Marvel / Mar-Vell First Appearance'
  image: '*string that links to an image of the funko pop'
 

в настоящее время это может дать мне номера funko только в том случае, если перед номером стоит ‘#’. Мне нужно было бы иметь возможность получить номер для функции funko pop во всех приведенных выше строках. Мне не понадобились бы дополнительные данные, как в Pop 2001, поскольку это всего лишь год. Я пытаюсь создать базу данных funko, и мне нужен только фактический номер funko pop. Одна из моих мыслей заключается в том, чтобы убедиться, что цифра funko pop не имеет длины 4 цифры, так как это сделало бы ее, скорее всего, годом, и при поиске в Интернете не видно, что funko pop # s больше 3 цифр. Но тогда это привело бы к чему-то вроде 80th, который также является просто серией, поскольку он содержит менее 4 цифр. Любая помощь была бы потрясающей!

Комментарии:

1.Если вам нужно только число, вы можете использовать группу захвата #([1-9]d*)b regex101.com/r/oFKJ2X/1

2. Не могли бы вы явно указать, каким должен быть результат для каждого ввода?

3. @TedBrownlow, да, поэтому каждый вывод должен быть таким объектом { номер: 526, имя: Pop Marvel 80th 526 Капитан Марвел / Мар-Велл Первое появление, изображение: ссылка на изображение }, но он должен быть способен работать для всех этих разных строк, как веб-сайт, с которого я извлекаю не строится одинаково во всех сериях funko pop

4. Может ли быть только одно вхождение числа в формате #23

5. @Thefourthbird мне понадобился бы только funko pop #, мне не нужен был бы номер даты или номер серии, то есть 2001 или 80-й. просто funko #, например, 23 или 526.

Ответ №1:

Вы можете использовать границы слов b и сопоставлять от 1 до 3 цифр.

 bd{1,3}b
 

Если после него не может быть a : , вы можете использовать отрицательный прогноз (?!:)

Демонстрация регулярных выражений

 [
  "Pop Icons #23 Paulie Pigeon Pinstripe Jersey NYCC",
  "Pop Marvel 80th 526 Captain Marvel / Mar-Vell First Appearance",
  "Pop 2001: A Space Odyssey #823 Dr. Frank Poole",
  "389 Blue-Eyes White Dragon",
  "Pop Up Movie Town #05 Kevin with Up House",
  "test 42:"
].forEach(s => {
  let m = s.match(/bd{1,3}b(?!:)/);
  console.log(m ? `${m[0]} --> match` : `${s} --> no match`);
});