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)
匹配前面有单词bounary的8\b8
匹配0+空格字符\s+
捕获组1,匹配([^8]+)
1+次以外的任何字符8
正向前瞻(?=
匹配0+空格字符,并匹配8后跟单词边界\s+8\b
关闭前瞻)
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
是不同的匹配,这里似乎不是这样。