У меня есть строка:
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
Вы можете использовать этот шаблон:
[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 Я думал, ты хочешь получить оба '"
? Если вам нужны только цифры, вы можете использовать две группы захвата: ([0-9]+)'(?:\s*([0-9]+)")?
опять же, очень полезно - с этим интересно поиграться - однако, подумав об этом и немного повозившись, ваш первоначальный ответ, вероятно, будет идеальным для того, что я хочу - большое спасибо - я добавил свой собственный ответ с несколько вариантов, но приму ваш ответ
С помощью @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}, что здесь лучше, чем *
Сделать необязательным все
/ \d+/
, а не только пространство? Получите, например. regex101.com чтобы объяснить вам ваш шаблон, если он неясен.