我有一个非常简单的代码:
var allTypes = "restaurant|dentist";
var typeSplitter = new RegExp("([a-zA-Z]+)");
typeSplitter.exec(allTypes);
我想要一个这样的数组:
[“餐厅”,“牙医”]
但相反,我得到了这个:
[“餐厅”,“餐厅”]
我确实在这里测试了我的正则表达式。我一直在摆弄这个,可能是我不知道的事情
我有一个非常简单的代码:
var allTypes = "restaurant|dentist";
var typeSplitter = new RegExp("([a-zA-Z]+)");
typeSplitter.exec(allTypes);
我想要一个这样的数组:
[“餐厅”,“牙医”]
但相反,我得到了这个:
[“餐厅”,“餐厅”]
我确实在这里测试了我的正则表达式。我一直在摆弄这个,可能是我不知道的事情
就这样做
allTypes.split('|');
// => ['restaurant', 'dentist']
.split
也可以采用正则表达式;即使在这种情况下没有必要
allTypes.split(/[|]/);
但是如果你真的想使用正则表达式来捕获,你必须使用.match
matches = allTypes.match(/([a-zA-Z]+)/g); // g = global modifier
因为exec
只返回一个匹配和所有捕获。第一个元素是完全匹配。第二个是第一个捕获(模式中的第一组括号)。由于您已将整个模式包裹在括号中,因此这些值是一致的(并且您的括号是不必要的)。使用match
and 一个全局修饰符来代替:
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
}