2015-07-10 96 views
1

我有一个像正则表达式来捕捉连续字

"Sony Xperia Z1 Compact" 
"Samsung Galaxy Trend Plus" 
"Samsung Galaxy Tab 2" 

移动设备的名单,我需要一个正则表达式来创建这些字符串标签以这种方式符合连续字(预期结果):

["Sony", "Sony Xperia", "Sony Xperia Z1", "Sony Xperia Z1 Compact"] 

我曾尝试一些与积极前瞻:

/(?=([a-z]+\s+[a-z]+))[a-z]+/i 

我获得:

model = "Samsung Galaxy Trend Plus" 
"Samsung Galaxy Trend Plus" 
model.match(/(?=([a-z]+\s+[a-z]+))[a-z]+/i) 
["Samsung", "Samsung Galaxy"] 

但这个时候你有一个字也不行,所以,添加一个可选的组后:

/(?=([a-z]+\s+[a-z]+))|[a-z]+/i 

我获得:

model = "Samsung" 
"Samsung" 
model.match(/(?=([a-z]+\s+[a-z]+))|[a-z]+/i) 
["Samsung", undefined] 

所以,试图概括:

/(?=([a-z]+\s+[a-z]+))(?=([a-z]+\s+[a-z]+\s+[a-z]+))(?=([a-z]+\s+[a-z]+\s+[a-z]+\s+[a-z]+))[a-z]+/i 

我得到

"Samsung Galaxy Trend Plus" 
model.match(/(?=([a-z]+\s+[a-z]+))(?=([a-z]+\s+[a-z]+\s+[a-z]+))(?=([a-z]+\s+[a-z]+\s+[a-z]+\s+[a-z]+))[a-z]+/i) 

["Samsung", "Samsung Galaxy", "Samsung Galaxy Trend", "Samsung Galaxy Trend Plus"] 

而且应该有高达ñ的话,如何让这个普通的正则表达式(在ñ字变量自由度)? 另外,如何摆脱undefined?正如here所解释的那样,我应该使用一个非捕获组,因此这会阻止我以我正在做的方式捕获连续的单词。

+1

的解决方案也成为一个reg EXP? – epascarello

+0

是的,它必须是一个正则表达式。 – loretoparisi

+7

我不认为'Sony Xperia Compact'是由连续的单词形成的。 [这个解决方案怎么样](http://jsfiddle.net/e6w0mp31/)? –

回答

1

我可以建议几乎纯粹的正则表达式解决方案。几乎因为我需要以交换字以获得正确的输出subphrases:

var re = /(?=\b((?:\S+[ \t]*)+))/g; 
 
var str = 'Sony Xperia Z1 Compact'; 
 
    
 
str = str.split(' ').reverse().join(' '); 
 
while ((m = re.exec(str)) !== null) { 
 
    if (m.index === re.lastIndex) { 
 
     re.lastIndex++; 
 
    } 
 
    document.getElementById("t").innerHTML += m[1].split(' ').reverse().join(' ') + "<br/>"; 
 
}
<div id="t"/>

(?=\b((?:\S+[ \t]*)+))正则表达式是捕获,然后可选空白的非空白字符的所有数据块(但不换行符号),并确保我们只使用字边界\b获得整个单词。

我认为很难得到它没有反转,因为我们在JS中没有可变宽度lookbehind。

+0

这很有道理。这是迄今为止通过纯正则表达式的最佳解决方案! – loretoparisi

0

虽然这不会帮助OP,因为他们在评论中表示,它必须是一个正则表达式解决方案,但用javascript实现这一点的快速方法是将字符串分割为空格字符,然后重新构建另一个数组循环:

var s = 'Sony Xperia Z1 Compact'; 

var a = s.split(' '); 
var b = [], c = []; 

for(var i=0; i < a.length; i++) { 
    b.push(a[i]); 
    c.push(b.join(' '));  
} 

c.toString(); = Sony,Sony Xperia,Sony Xperia Z1,Sony Xperia Z1 Compact

看到demo here

+0

这是一个没有正则表达式的好的解决方案,不幸的是我需要一个正则表达式。无论如何,谢谢你。 – loretoparisi

3

对于那些谁也有类似的问题,但不希望(AB)使用正则表达式:

name = "Samsung Galaxy Trend Plus"; 
 

 
result = name.split(/\s+/g).map(function(_, i, a) { 
 
    return a.slice(0, i + 1).join(" ") 
 
}); 
 

 
document.write(result);

+1

没有正则表达式并使用函数映射的好解决方案。 – loretoparisi

+0

比我的努力更简洁,并将我介绍给数组映射函数 – garyh