Javascript 正则表达式以匹配管道分隔字符串最后五个单词中的给定单词

Javascript 正则表达式以匹配管道分隔字符串最后五个单词中的给定单词,javascript,regex,Javascript,Regex,假设我们有一根绳子 blue|blue|green|blue|blue|yellow|yellow|blue|yellow|yellow| 我们想知道单词“yellow”是否出现在字符串的最后5个单词中,特别是通过返回一个包含这些出现(如果有的话)的捕获组 有没有办法用正则表达式做到这一点 更新:我正在给正则表达式引擎提供一些规则。出于各种原因,我尝试使用引擎,而不是离开引擎,这将是我最后的选择 这样简单的事情不需要使用正则表达式 只需在管道上拆分,并使用索引进行检查: var group =

假设我们有一根绳子

blue|blue|green|blue|blue|yellow|yellow|blue|yellow|yellow|
我们想知道单词“yellow”是否出现在字符串的最后5个单词中,特别是通过返回一个包含这些出现(如果有的话)的捕获组

有没有办法用正则表达式做到这一点


更新:我正在给正则表达式引擎提供一些规则。出于各种原因,我尝试使用引擎,而不是离开引擎,这将是我最后的选择

这样简单的事情不需要使用正则表达式

只需在管道上拆分,并使用
索引进行检查

var group = 'blue|blue|green|blue|blue|yellow|yellow|blue|yellow|yellow';

if ( group.split('|').slice(-5).indexOf('yellow') == -1 ) {
    alert('Not there :(');
} else {
    alert('Found!!!');
}

注意:
indexOf
在IE<9中不受本机支持,但对它的支持是可以的。

这样简单的事情不需要使用正则表达式

只需在管道上拆分,并使用
索引进行检查

var group = 'blue|blue|green|blue|blue|yellow|yellow|blue|yellow|yellow';

if ( group.split('|').slice(-5).indexOf('yellow') == -1 ) {
    alert('Not there :(');
} else {
    alert('Found!!!');
}

注意:
indexOf
在IE<9中不受本机支持,但对它的支持是可以的。

想不出用一个正则表达式来实现这一点的方法,但您可以为最后五个位置中的每一个形成一个正则表达式,并对匹配项求和

var string = "blue|blue|green|blue|blue|yellow|yellow|blue|yellow|yellow|";

var regexes = [];
regexes.push(/(yellow)\|[^|]+\|[^|]+\|[^|]+\|[^|]+\|$/);
regexes.push(/(yellow)\|[^|]+\|[^|]+\|[^|]+\|$/);
regexes.push(/(yellow)\|[^|]+\|[^|]+\|$/);
regexes.push(/(yellow)\|[^|]+\|$/);
regexes.push(/(yellow)\|$/);

var count = 0;
var regex;
while (regex = regexes.shift()) {
  if (string.match(regex)) {
    count++;
  }
}

console.log(count);

应该找到四个匹配项。

想不出用一个正则表达式实现这一点的方法,但可以为最后五个位置中的每一个形成一个正则表达式,并对匹配项求和

var string = "blue|blue|green|blue|blue|yellow|yellow|blue|yellow|yellow|";

var regexes = [];
regexes.push(/(yellow)\|[^|]+\|[^|]+\|[^|]+\|[^|]+\|$/);
regexes.push(/(yellow)\|[^|]+\|[^|]+\|[^|]+\|$/);
regexes.push(/(yellow)\|[^|]+\|[^|]+\|$/);
regexes.push(/(yellow)\|[^|]+\|$/);
regexes.push(/(yellow)\|$/);

var count = 0;
var regex;
while (regex = regexes.shift()) {
  if (string.match(regex)) {
    count++;
  }
}

console.log(count);
/\b(yellow)\|(?=(?:\w+\|){0,4}$)/g
应该找到四个匹配项

/\b(yellow)\|(?=(?:\w+\|){0,4}$)/g
这将为每个
yellow |
返回一个命中,后跟少于五个单词(根据您对“单词”的定义)。这假设序列始终以管道结束;如果不是这样,您可能希望将其更改为:

/\b(yellow)(?=(?:\|\w+){0,4}\|?$)/g

编辑(回应评论):此解决方案中“单词”的定义是任意的,与实际使用情况不符。要允许使用诸如“真实世界”之类的连字号,可以使用以下命令:

/\b(yellow)\|(?=(?:\w+(?:-\w+)*\|){0,4}$)/g
…或者,对于此特定作业,您可以将单词定义为除管道以外的任何字符中的一个或多个:

这将为每个
yellow |
返回一个命中,后跟少于五个单词(根据您对“单词”的定义)。这假设序列始终以管道结束;如果不是这样,您可能希望将其更改为:

/\b(yellow)(?=(?:\|\w+){0,4}\|?$)/g

编辑(回应评论):此解决方案中“单词”的定义是任意的,与实际使用情况不符。要允许使用诸如“真实世界”之类的连字号,可以使用以下命令:

/\b(yellow)\|(?=(?:\w+(?:-\w+)*\|){0,4}$)/g
…或者,对于此特定作业,您可以将单词定义为除管道以外的任何字符中的一个或多个:


对不起,应该更清楚一点-出于各种原因,它必须是正则表达式。它必须以捕获组的形式返回其结果,该捕获组要么为空(如果黄色不出现在最后几个字中),要么包含字符串最后五个字中黄色出现的次数。@Roxicus-请将此新要求放入实际问题中(使用编辑按钮)任何试图回答你问题的人都能看到。因为在我们看来,当正则表达式不是解决问题的最直接的方法时,坚持使用正则表达式解决方案似乎有点司空见惯,所以您可能也想解释一下原因。这要么会阻止你不感兴趣的答案,要么会寻求其他可以满足你要求的替代方案。对不起,应该更清楚一点——出于各种原因,它必须是一个正则表达式。它必须以捕获组的形式返回其结果,该捕获组要么为空(如果黄色不出现在最后几个字中),要么包含字符串最后五个字中黄色出现的次数。@Roxicus-请将此新要求放入实际问题中(使用编辑按钮)任何试图回答你问题的人都能看到。因为在我们看来,当正则表达式不是解决问题的最直接的方法时,坚持使用正则表达式解决方案似乎有点司空见惯,所以您可能也想解释一下原因。这要么会阻止你不感兴趣的答案,要么会寻求其他可能满足你要求的替代方案。(\w*)\\\对于捕获组,但需要反过来,并限制在前五个词内。“前五个”(来自你的评论)或“后五个”(来自你的问题)?为什么它必须是正则表达式?你在处理某种大脑受损的API吗?请参阅我的问题更新。最后五个。你能澄清一下你是想知道是否至少有一个匹配项,还是想知道匹配项的确切数目吗?(\w*)\\\\对于捕获组,但它需要反向进行,并且仅限于前五个词。“前五个”(来自你的评论)还是“最后五个”(来自你的问题)?为什么它必须是正则表达式?你在处理某种大脑受损的API吗?请参阅我的问题更新。最后五个。你能澄清一下你是想知道至少有一场比赛还是想知道确切的比赛次数吗?很好。花了一些时间才弄明白你做了什么,但它起作用了。有趣的旁注:Rubular.com在没有管道的情况下返回'yellow',而javascript中的相同内容在管道的情况下返回'yellow |'。奇怪,因为管道不在我们的捕获组中。显然,Rubular正在返回编号最高的捕获组(
$1
)的内容,该组不包括管道。JavaScript为您提供了整体匹配(
$0
$&
),其中确实包括它。(当然,这是第一个正则表达式;第二个正则表达式在任何情况下都不应该看到管道。)刚刚发现字符串数据有一个褶皱。有时我所说的单词实际上包含破折号,我认为这意味着使用\w+是不正确的,因为它会在破折号处停止,比如说“yel low”,而我需要它整体上变为“yel low”。尝试将第一个正则表达式中的\w+\\替换为像\/.*?\\这样的非贪婪捕获,但没有成功。它在字符串中的任意位置捕获“yel low”,而不仅仅是在最后五个“单词”中。很好。花了一些时间才弄明白你做了什么,但它起作用了。有趣的旁注:Rubular.com返回没有管道的“黄色”,而t