我不明白为什么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
?
答案 0 :(得分:3)
结果将是匹配的数据(文本),如果您要匹配零或一,并且它匹配为零则则没有要返回的数据,并且未定义是该结果。
我会推测保留匹配原因的设计原因是因为它使索引保持一致,因此您仍然可以按照预期访问它们。通过这种方式,您可以通过检查undefined
来有效地测试“匹配任何内容”。
如果要将其从阵列中删除,则可以使用filter
函数,例如:
arr = arr.filter(function(e){return e});
答案 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)
我不知道是否可以在没有它的情况下直接获取数组(我的意思是不过滤数组)。