Javascript 正则表达式之间的所有匹配

Javascript 正则表达式之间的所有匹配,javascript,regex,Javascript,Regex,我想匹配本文中的所有foo和bar(那些仅在8字符之间的字符) 这就是我尝试的:8.*(foo | bar)。*8 问题是它只匹配最后一个条,因为(我相信)贪婪的量词会尽其所能 我尽了最大的努力,试图寻找如何解决这个问题,但最终没有找到任何东西,所以我在这里问 我当前的正则表达式,以便您更好地理解我的意思:8([^8]*(foo | bar)+[^8]*)8 请参阅以获取解释 这就是问题的实质: 重复捕获组将只捕获最后一次迭代。在重复组周围放置一个捕获组以捕获所有迭代,或者如果您对数据不感兴趣,

我想匹配本文中的所有
foo
bar
(那些仅在
8
字符之间的字符)

这就是我尝试的:
8.*(foo | bar)。*8

问题是它只匹配最后一个
,因为(我相信)贪婪的量词会尽其所能

我尽了最大的努力,试图寻找如何解决这个问题,但最终没有找到任何东西,所以我在这里问

我当前的正则表达式,以便您更好地理解我的意思:

8([^8]*(foo | bar)+[^8]*)8

请参阅以获取解释

这就是问题的实质:

重复捕获组将只捕获最后一次迭代。在重复组周围放置一个捕获组以捕获所有迭代,或者如果您对数据不感兴趣,则使用非捕获组


正则表达式捕获的替代方法是
split
map
或类似的数组函数:

let   str = 'foo bar foo 8 bar foo cruft foo fnooz bar 8 foo bar foo'
let   is8 = false

// split string on spaces 
str.split(/\s/).map(el => {
  // toggle 'is8' when encountered
  if(el == 8)
    is8 = !is8

  // 'is8' is true, and el matches regex
  if(is8 && /(foo|bar)/.test(el)) 
  {        
    // do something with el between the 8's e.g. uppercase
    return el.toUpperCase()
  }
  return el
}).join(' ')

// yields "foo bar foo 8 BAR FOO cruft FOO fnooz BAR 8 foo bar foo"

您可以匹配第一个
8
,然后在第1组中捕获第二次出现8之间的内容,如果您还想在接下来的第8次出现时获得匹配,请使用正向前瞻

如果需要单独的部分,可以在空间上拆分组1中的数据

 \b8\s+([^8]+)(?=\s+8\b)
  • \b8
    匹配前面有单词bounary的8
  • \s+
    匹配0+空格字符
  • ([^8]+)
    捕获组1,匹配
    8
    1+次以外的任何字符
  • (?=
    正向前瞻
    • \s+8\b
      匹配0+空格字符,并匹配8后跟单词边界
  • 关闭前瞻

const模式=/\b8\s+([^8]+)(?=\s+8\b)/;
let str=“foo bar foo 8 bar foo bar 8 foo bar foo”;
str=str.match(pattern)[1]。拆分(“”);
console.log(str)(在regex101中尝试时,它似乎允许Javascript中的非固定宽度查找。如果这对您有效,您可以尝试此方法)

如果您的环境允许非固定宽度向后看,您可以尝试

(?<=8.*)(foo|bar)(?=.*8)
Explanation:
(?<=   )                   positive look-behind, i.e. preceded by
    8.*                        8, then zero-or-more character
        (foo|bar)          "foo" or "bar", in capture group
                 (?=   )   postiive look-ahead, i.e. followed by
                    .*8        zero-or-more characters, then 8

(?用你的语言标记你的问题总是好的,特别是因为不同的正则表达式引擎之间有很多差异。这个问题在PHP中相对容易解决,在JS中要困难得多。在
8
s之间除了
foo
bar
之外,还能有其他单词吗?@Nick是的,基本上可以有如果可变长度的look-behind是可用的,那么Nythingtings将更容易,但在Javascript中这是不可能的。它需要一个纯正则表达式解决方案吗?嘿,谢谢你的回答。但是,这似乎不是我想要的。我希望
foo
bar
是不同的匹配,这里似乎不是这样。