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

У меня есть строка:

const str = `abcde 9'2" abcde 8' abcde 7' 11" abcde`

Я пытаюсь извлечь эти значения:

[ "9'2", "8'", "7' 11" ]

Я хочу использовать группы регулярных выражений для достижения этой цели (мой реальный код гораздо сложнее, и группы регулярных выражений упростят ситуацию), но мое регулярное выражение не совсем работает. Как я могу заставить все три теста возвращать true в приведенном ниже фрагменте кода?

const str = `abcde 9'2" abcde 8' abcde 7' 11" abcde`

const regex = /(\d+' ?\d+)"/g

const matches = [...str.matchAll(regex)]

const actual = matches.map(x => x[1])

const expected = [ "9'2", "8'", "7' 11" ]

console.info(actual) // [ "9'2", "7' 11" ]

// tests
console.info(actual[0] === expected[0]) // true
console.info(actual[1] === expected[1]) // false
console.info(actual[2] === expected[2]) // false

Сделать необязательным все / \d+/, а не только пространство? Получите, например. regex101.com чтобы объяснить вам ваш шаблон, если он неясен.

jonrsharpe 01.08.2024 00:20
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Улучшение производительности загрузки с помощью Google Tag Manager и атрибута Defer
Улучшение производительности загрузки с помощью Google Tag Manager и атрибута Defer
В настоящее время производительность загрузки веб-сайта имеет решающее значение не только для удобства пользователей, но и для ранжирования в...
Безумие обратных вызовов в javascript [JS]
Безумие обратных вызовов в javascript [JS]
Здравствуйте! Юный падаван 🚀. Присоединяйся ко мне, чтобы разобраться в одной из самых запутанных концепций, когда вы начинаете изучать мир...
Система управления парковками с использованием HTML, CSS и JavaScript
Система управления парковками с использованием HTML, CSS и JavaScript
Веб-сайт по управлению парковками был создан с использованием HTML, CSS и JavaScript. Это простой сайт, ничего вычурного. Основная цель -...
JavaScript Вопросы с множественным выбором и ответы
JavaScript Вопросы с множественным выбором и ответы
Если вы ищете платформу, которая предоставляет вам бесплатный тест JavaScript MCQ (Multiple Choice Questions With Answers) для оценки ваших знаний,...
1
1
50
2
Перейти к ответу Данный вопрос помечен как решенный

Ответы 2

Ответ принят как подходящий

Вы можете использовать этот шаблон:

[0-9]+'(?:\s*[0-9]+")?

const str = `abcde 9'2" abcde 8' abcde 7' 11" abcde`;

const regex = /[0-9]+'(?:\s*[0-9]+")?/g;

const matches = [...str.matchAll(regex)];

const actual = matches.map((x) => x[0]);
const expected = [`9'2"`, `8'`, `7' 11"`];

console.info(actual[0] === expected[0]); 
console.info(actual[1] === expected[1]); 
console.info(actual[2] === expected[2]); 

большое спасибо за ответ - к сожалению, это также отражает " - но я могу с этим работать - очень признателен

danday74 01.08.2024 00:40

@danday74 Я думал, ты хочешь получить оба '"? Если вам нужны только цифры, вы можете использовать две группы захвата: ([0-9]+)'(?:\s*([0-9]+)")?

user24714692 01.08.2024 00:42

опять же, очень полезно - с этим интересно поиграться - однако, подумав об этом и немного повозившись, ваш первоначальный ответ, вероятно, будет идеальным для того, что я хочу - большое спасибо - я добавил свой собственный ответ с несколько вариантов, но приму ваш ответ

danday74 01.08.2024 01:12

С помощью @user24714692 я нашел еще несколько вариантов, которые тоже работают!

const str = `abcde 9'2" abcde 8' abcde 7' 11" abcde`

const regexes = [
  /[0-9]+'(?:\s*[0-9]+")?/g,
  /\d+'(?: *\d+")?/g,
  /\d+'(?: ?\d+")?/g
]

for (let regex of regexes) {
  const matches = [...str.matchAll(regex)]

  const actual = matches.map(x => x[0])
  const expected = [ `9'2"`, `8'`, `7' 11"` ]

  console.info(actual)
  
  // tests
  console.info(actual[0] === expected[0]) // true
  console.info(actual[1] === expected[1]) // true
  console.info(actual[2] === expected[2]) // true
}
/\d+'(?: ?\d+")?/g мне больше всего подходит, так как ? означает {0,1}, что здесь лучше, чем *
danday74 01.08.2024 01:18

Другие вопросы по теме