Невозможно распечатать совпадения регулярных выражений в JavaScript

У меня есть этот код, и я хочу распечатать все имена людей, которые являются веганами, в настоящее время он просто печатает «-».

var  people = `- james (vegan)
                     - David 
                     - Craig (vegetarian)
                     - Bob (vegan)`

    if (/[-\s(\w+?)\s(?=\(vegan\))]/.test(people) == true)
        {
            var match = /[-\s(\w+?)\s(?=\(vegan\))]/
            document.write(people.match(match))
        }
    else 
        {
            document.write("invalid")
        }

я тоже это пробовал

console.info(people.match(match));

Любая помощь будет потрясающей!

Все ваше регулярное выражение находится внутри набора символов. Возьмите это, для одного

CertainPerformance 16.04.2019 07:25

Хорошо, готово, у меня есть /-\s([\w]+)\s(?=(веган))/ теперь выводит "- james ,james"?

akemedis 16.04.2019 07:29

да потому что это matches - чего вы ожидали?

Jaromanda X 16.04.2019 07:30

Я ожидал -Джеймс, -Боб

akemedis 16.04.2019 07:34

тогда вам понадобится не одна спичка... g

Jaromanda X 16.04.2019 07:35
Поведение ключевого слова "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) для оценки ваших знаний,...
0
5
45
3
Перейти к ответу Данный вопрос помечен как решенный

Ответы 3

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

Ваше регулярное выражение написано неправильно и имеет только один набор символов, из-за которого оно соответствует только одному символу за раз и печатает его. Вам нужно исправить регулярное выражение с помощью этого кода JS,

var  people = `- james (vegan)
                     - David 
                     - Craig (vegetarian)
                     - Bob (vegan)`

    if (/-\s+\w+(?=\s+\(vegan\))/.test(people) == true)
        {
            var match = /-\s+\w+(?=\s+\(vegan\))/
            console.info(people.match(match))
        }
    else 
        {
            console.info("invalid")
        }

Если вы просто хотите напечатать только имена веганов, вы можете использовать этот код.

var  people = `- james (vegan)
                     - David 
                     - Craig (vegetarian)
                     - Bob (vegan)`

    if (/-\s+\w+(?=\s+\(vegan\))/.test(people) == true)
        {
            var match = /-\s+(\w+)(?=\s+\(vegan\))/g;
            var m = match.exec(people);
            while (m!= null) {
                console.info(m[1]);
                m = match.exec(people);
            }
        }
    else 
        {
            console.info("invalid")
        }

Редактировать: Согласно предложению Анубхава, вам на самом деле не нужно отдельно вызывать метод test, а затем match/exec, что будет дорого, и вместо этого вы можете использовать эти коды, где необходимость в методе test устранена. Спасибо Анубхава за то, что следил за моим ответом и дал отличное предложение.

Вот обновленная демонстрация кода JS,

var  people = `- james (vegan)
                     - David 
                     - Craig (vegetarian)
                     - Bob (vegan)`
                     
var match = /-\s+(\w+)(?=\s+\(vegan\))/g;
var m = match.exec(people);

if (m == null) {
	console.info("invalid")
} else {
        console.info(m[1]);
	while ((m = match.exec(people))!= null) {
		console.info(m[1]);
	}
}

Вы внесли еще два изменения... почему вы удалили () вокруг \w+? зачем ты добавил g?

Jaromanda X 16.04.2019 07:31

@JaromandaX: Ах, ты прав. Моя ошибка, для печати только имени нужна будет эта группировка. Позвольте мне обновить мой ответ. Спасибо, что указали.

Pushpesh Kumar Rajwanshi 16.04.2019 07:32

Очень хорошее регулярное выражение ++ Хотя я думаю, что 2 отдельных вызова методов test, а затем match можно объединить в один.

anubhava 16.04.2019 08:22

@anubhava: Вы действительно правы. Я просто попытался внести минимальные изменения в код OP, чтобы заставить его работать, но я думаю, что будет лучше, если я предложу еще лучшие коды, как вы предложили, где ему не нужно вызывать методы test и match отдельно, удваивая стоимость регулярного выражения. Позвольте мне обновить ваше предложение в моем посте. Спасибо за ваше предложение. Очень признателен.

Pushpesh Kumar Rajwanshi 16.04.2019 08:39

Вы можете использовать регулярное выражение /\s*-\s(.+?)\s\(vegan\)/. Используйте exec следующим образом:

let regex = /\s*-\s(.+?)\s\(vegan\)/g, 
    matches = [], 
    match,
    str = `- james (vegan)
                     - David 
                     - Craig (vegetarian)
                     - Bob (vegan)`

while(match = regex.exec(str))
  matches.push(match[1])

console.info(matches)
people.split('\n')
  .map(line=>line.trim())
  .map(line=>{
    let matched = line.match(/-\s(\w+)(\s\((\w+)\))?/); 
    return {name: matched[1],type:matched[3]};
  })
  .filter(item=>item.type=='vegan')
  .map(item=>item.name)

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