假设我们有一个字符串
blue|blue|green|blue|blue|yellow|yellow|blue|yellow|yellow|
我们想弄清楚字符串的最后5个单词中是否出现“黄色”这个词,特别是返回包含这些出现的捕获组(如果有的话)。
有没有办法用正则表达式做到这一点?
更新:我正在为正则表达式引擎提供一些规则。出于各种原因,我正在尝试使用引擎而不是去外面,这将是我的最后手段。
答案 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);
应找到四场比赛。