У меня есть этот код, и я хочу распечатать все имена людей, которые являются веганами, в настоящее время он просто печатает «-».
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));
Любая помощь будет потрясающей!
Хорошо, готово, у меня есть /-\s([\w]+)\s(?=(веган))/ теперь выводит "- james ,james"?
да потому что это matches - чего вы ожидали?
Я ожидал -Джеймс, -Боб
тогда вам понадобится не одна спичка... g



![Безумие обратных вызовов в javascript [JS]](https://i.imgur.com/WsjO6zJb.png)


Ваше регулярное выражение написано неправильно и имеет только один набор символов, из-за которого оно соответствует только одному символу за раз и печатает его. Вам нужно исправить регулярное выражение с помощью этого кода 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?
@JaromandaX: Ах, ты прав. Моя ошибка, для печати только имени нужна будет эта группировка. Позвольте мне обновить мой ответ. Спасибо, что указали.
Очень хорошее регулярное выражение ++ Хотя я думаю, что 2 отдельных вызова методов test, а затем match можно объединить в один.
@anubhava: Вы действительно правы. Я просто попытался внести минимальные изменения в код OP, чтобы заставить его работать, но я думаю, что будет лучше, если я предложу еще лучшие коды, как вы предложили, где ему не нужно вызывать методы test и match отдельно, удваивая стоимость регулярного выражения. Позвольте мне обновить ваше предложение в моем посте. Спасибо за ваше предложение. Очень признателен.
Вы можете использовать регулярное выражение /\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)
Все ваше регулярное выражение находится внутри набора символов. Возьмите это, для одного