代码之家  ›  专栏  ›  技术社区  ›  danday74

如何使用正则表达式组从字符串中提取所有所需的值?

  •  2
  • danday74  · 技术社区  · 7 月前

    我有一个字符串:

    const str = `abcde 9'2" abcde 8' abcde 7' 11" abcde`
    

    我试图提取这些值:

    [ "9'2", "8'", "7' 11" ]
    

    我想使用正则表达式组来实现这一点(我的实际代码要复杂得多,正则表达式组会简化事情),但我的正则表达式不太有效。如何在下面的代码片段中使所有3个测试都返回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.log(actual) // [ "9'2", "7' 11" ]
    
    // tests
    console.log(actual[0] === expected[0]) // true
    console.log(actual[1] === expected[1]) // false
    console.log(actual[2] === expected[2]) // false
    2 回复  |  直到 7 月前
        1
  •  1
  •   user24714692    7 月前

    您可以使用此模式:

    [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.log(actual[0] === expected[0]); 
    console.log(actual[1] === expected[1]); 
    console.log(actual[2] === expected[2]); 
        2
  •  1
  •   danday74    7 月前

    在@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.log(actual)
      
      // tests
      console.log(actual[0] === expected[0]) // true
      console.log(actual[1] === expected[1]) // true
      console.log(actual[2] === expected[2]) // true
    }