如何摆脱正则表达式结果中的“未定义”?

时间:2014-01-21 11:37:05

标签: javascript regex

我不明白为什么undefined出现在结果中。我使用问号(\d+)?matches the previous element zero or one time

// I want to match two cases with one regexp:
//   "GBP 5 per hour" and "GBP 5 per 10 hours"
//
"GBP 5 per hour".match(/([a-z]{3}) (\d+(?:\.\d+)?) per\s?(\d+)?\s?(hours?|days?|minutes?)/im)
["GBP 5 per hour", "GBP", "5", undefined, "hour"]  // actual result
["GBP 5 per hour", "GBP", "5", "hour"]  // the result I'd like to get

如何摆脱undefined

5 个答案:

答案 0 :(得分:3)

结果将是匹配的数据(文本),如果您要匹配零或一,并且它匹配为零则则没有要返回的数据,并且未定义是该结果。

我会推测保留匹配原因的设计原因是因为它使索引保持一致,因此您仍然可以按照预期访问它们。通过这种方式,您可以通过检查undefined来有效地测试“匹配任何内容”。

如果要将其从阵列中删除,则可以使用filter函数,例如:

arr = arr.filter(function(e){return e});

Which I stole from here

答案 1 :(得分:2)

尝试

var x = ["GBP 5 per hour", "GBP", "5", undefined, "hour"];
var y = x.filter(Boolean);

在Javascript中,任何非正确的值都是false,应该有所帮助。几个月前由Elad here

撰写

答案 2 :(得分:2)

不比

简单
"GBP 5 per hour"
    .match(/([a-z]{3}) (\d+(?:\.\d+)?) per\s?(\d+)?\s?(hours?|days?|minutes?)/im)
    .filter(function(i){return typeof i != 'undefined'})

由于match将返回一个数组,您可以使用filter方法过滤其元素。 filter方法可以接受回调(闭包,函数名称为string,...)。迭代数组元素,每个元素都传递给回调函数,如果回调返回值等于Boolean True

,则仅接受

希望有所帮助

答案 3 :(得分:1)

您的RegEx中有问题的部分是:

per\s?(\d+)?\s?

三种可能的解决方案:

<script type="text/javascript">
//Quick & Dirty
var $text = "GBP 5 per hour";
var $arr = $text.match(/([a-z]{3}) (\d+(?:\.\d+)?) per ?(\d+)?\s?(hours?|days?|minutes?)/im);
console.log( $arr )
var $arrTmp = []
for( var $i = 0; $i < $arr.length; $i++ )
    if( typeof $arr[$i] != 'undefined' )
        $arrTmp.push( $arr[$i] )
$arr = $arrTmp;
console.log( $arr );

//Different approach
var $text = "GBP 5 per hour";
var $text1 = "GBP 5 per 10 hours";
var $regEx = /([a-z]{3}) (\d+(?:\.\d+)?) per(.*)(hours?|days?|minutes?)/im
var $arr = $text.match( $regEx );
var $arr1 = $text1.match( $regEx );

if( !isNaN( parseInt( $arr[3] ) ) )
    $arr[3] = parseInt( $arr[3] );
else
    $arr[3] = 1;
if( !isNaN( parseInt( $arr1[3] ) ) )
    $arr1[3] = parseInt( $arr1[3] );
else
    $arr1[3] = 1;


console.log( $arr1 );   
console.log( $arr );
</script>

答案 4 :(得分:1)

undefined表示当数字存在时,您尝试匹配的最后一位数字应为(per\s?(\d+))。

要在任何情况下保持连贯,你应该保留它,并且可能像处理1那样处理它。

如果您喜欢空字符串,可以试试这个:

"GBP 5 per hour".match(/([a-z]{3}) (\d+(?:\.\d+)?) per\s?([\d]*)\s?(hours?|days?|minutes?)/im)

我不知道是否可以在没有它的情况下直接获取数组(我的意思是不过滤数组)。