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

时间:2011-09-19 00:40:32

标签: javascript regex

假设我们有一个字符串

blue|blue|green|blue|blue|yellow|yellow|blue|yellow|yellow|

我们想弄清楚字符串的最后5个单词中是否出现“黄色”这个词,特别是返回包含这些出现的捕获组(如果有的话)。

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

更新:我正在为正则表达式引擎提供一些规则。出于各种原因,我正在尝试使用引擎而不是去外面,这将是我的最后手段。

3 个答案:

答案 0 :(得分:3)

不需要使用正则表达式来做这么简单的事情。

只需在管道上拆分,然后查看indexOf

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,但对它的支持可以是added very easily

答案 1 :(得分:3)

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

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

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

编辑(回应评论):此解决方案中“单词”的定义是任意的,并不真正对应于实际使用。要允许像“真实世界”这样的连字符,你可以使用它:

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

...或者,对于这个特定的工作,你可以将一个单词定义为除管道之外的任何字符中的一个或多个

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

答案 2 :(得分:0)

无法想出使用单个正则表达式执行此操作的方法,但您可以为最后五个位置中的每个位置组成一个并对匹配进行求和。

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);

应找到四场比赛。