2012-12-21 43 views
2

我有一个非常简单的代码:为什么我从regex.exec获得单个值?

var allTypes = "restaurant|dentist"; 
var typeSplitter = new RegExp("([a-zA-Z]+)"); 
typeSplitter.exec(allTypes); 

我想一个数组是这样的:

[ “餐厅”, “牙医”]

而是我得到这个:

[“restaurant”,“restaurant”]

我测试了我的正则表达式here。我一直在摆弄的方式来长这一点,可能是一些我不知道

回答

9

只是这样做

allTypes.split('|'); 
// => ['restaurant', 'dentist'] 

.split还可以一个正则表达式;即使它没有必要在这种情况下

allTypes.split(/[|]/); 

但是,如果你真的想用正则表达式来捕捉,你必须使用.match

matches = allTypes.match(/([a-zA-Z]+)/g); // g = global modifier 
+0

以防万一,我可能需要我的正则表达式(它变得更复杂),我使用“EXEC”是否正确? –

+0

@ code-gijoe不,看我的回答;) –

+3

@ code-gijoe:正则表达式是一个很棒的俱乐部,可以让这个简单的东西变得简单。做最简单的事情,如果你需要更多的东西,然后启动你的正则表达式。 –

4

因为exec只返回一个匹配和全攻略。第一个元素是完整匹配。第二个是第一个捕获(你模式中的第一个括号)。既然你已经用括号把整个模式包裹起来了,这些值是一致的(你的括号是不必要的)。使用match和全球改性剂来代替:

var result = "restaurant|dentist".match(/[a-zA-Z]+/g); 

如果你有更复杂的模式,你需要捕获组的每一场比赛,然后exec是要走的路。但你仍然需要在一个循环中使用的全球改性剂和运行exec

var regex = /your(Pattern)here/g; 
var m; 
while (m = regex.exec(input)) 
{ 
    var entireMatch = m[0]; 
    var firstCapture = m[1]; 
    // ... 
    // process results 
} 
+1

或者如果您确实想要使用新的RegExp(),请使用新的RegExp(pattern,“g”)传递全局修饰符 – CupawnTae

相关问题