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

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

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.log(people.match(match));

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

Ответы [ 3 ]

3 голосов
/ 16 апреля 2019

Ваше регулярное выражение написано неправильно и содержит только один набор символов, из-за чего оно соответствует только одному символу за раз и печатает его.Вам нужно исправить свое регулярное выражение с помощью этого кода 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.log(people.match(match))
        }
    else 
        {
            console.log("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.log(m[1]);
                m = match.exec(people);
            }
        }
    else 
        {
            console.log("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.log("invalid")
} else {
        console.log(m[1]);
	while ((m = match.exec(people))!= null) {
		console.log(m[1]);
	}
}
1 голос
/ 16 апреля 2019

Вы можете использовать регулярное выражение /\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.log(matches)
0 голосов
/ 16 апреля 2019
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)

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...