javascript正则表达式匹配不按预期工作

时间:2014-07-17 16:26:48

标签: javascript regex match

我正在尝试做一些非常简单的事情,但我无法以我想要的方式开展工作。我确信它正在做我要求它做的事情,但我没理解语法。

第1部分:

在下面的示例中,我想在geotech和Input之间提取字符串的一部分。

x = "geotechCITYInput"
x.match(/^geotech(.*)(?:Input|List)$/)

结果:

["geotechCITYInput", "CITY"]

我在perl / python甚至是javascript中写了多年的正则表达式,但我从未见过?:语法,我认为这是我应该在这里使用的。

第2部分:

我试图解决的更高级别的问题更复杂。我有一个表单,其中包含许多元素,定义为geotechXXXXInput或geotechXXXXList。我想创建一个XXXX值数组,但仅当名称以Input结尾时才会生成。

示例表单定义:

obj0.name = "geotechCITYInput"
obj1.name = "geotechCITYList"
obj2.name = "geotechSTATEInput"
obj3.name = "geotechSTATEList"

我最终想要一个像这样的数组:

["CITY","STATE"]

我可以通过API调用轻松地遍历表单对象,但我无法弄清楚如何编写正则表达式来匹配我想要的那些。这就是我现在所拥有的,但它不起作用。

geotechForm.forEachItem(function(name) {
    if(name.match(/Input$/)
        inputFieldNames.push( name.match(/^geotech(.*)Input$/) );
});

任何建议都将不胜感激。

1 个答案:

答案 0 :(得分:1)

您的正则表达式中缺少InputList后缀。如果名称以geotech开头并以InputList结尾,则会匹配,并且它将返回一个数组,其中间的文本作为数组中的第二项。

geotechForm.forEachItem(function (name) {
    var match = name.match(/^geotech(.*)(Input|List)$/);

    if (match) {
        inputFieldNames.push(match[1]);
    }
});