无法在JavaScript中打印出正则表达式的匹配项

时间:2019-04-16 05:22:52

标签: javascript regex

我有此代码,我想打印出所有素食主义者的姓名,目前只打印“-”。

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 个答案:

答案 0 :(得分: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.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")
        }

编辑: 根据{{​​3}}的建议,实际上您不需要分别调用test方法,然后再调用match/exec,这将很昂贵,而您可以在需要{{ 1}}方法已删除。感谢Anubhava跟踪我的回答并提出宝贵建议。

这是更新的JS代码演示

test

答案 1 :(得分:1)

您可以使用正则表达式/\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)

答案 2 :(得分:0)

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)