Javascript 如何摆脱;“未定义”;在regexp结果中?
我不明白为什么结果中会出现Javascript 如何摆脱;“未定义”;在regexp结果中?,javascript,regex,Javascript,Regex,我不明白为什么结果中会出现undefined。我使用问号(\d+)?,它: 如何摆脱未定义的?正则表达式有问题的部分是: 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?|
undefined
。我使用问号(\d+)?
,它:
如何摆脱未定义的?正则表达式有问题的部分是:
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>
//又快又脏
var$text=“每小时5英镑”;
var$arr=$text.match(/([a-z]{3})(\d+(?:\.\d+))每(\d+)\s?(小时?天?分钟?)/im);
console.log($arr)
var$arrTmp=[]
对于(变量$i=0;$i<$arr.length;$i++)
if(typeof$arr[$i]!=‘未定义’)
$arrTmp.push($arr[$i])
$arr=$arrTmp;
控制台日志($arr);
//不同的方法
var$text=“每小时5英镑”;
var$text1=“每10小时5英镑”;
var$regEx=/([a-z]{3})(\d+(?:\.\d+))每(.*)(小时?天?分钟?)/im
var$arr=$text.match($regEx);
var$arr1=$text1.match($regEx);
如果(!isNaN(parseInt($arr[3]))
$arr[3]=parseInt($arr[3]);
其他的
$arr[3]=1;
如果(!isNaN(parseInt($arr1[3]))
$arr1[3]=parseInt($arr1[3]);
其他的
$arr1[3]=1;
console.log($arr1);
控制台日志($arr);
试试看
在Javascript中,任何不正确的值都是false,这应该会有所帮助。几个月前发现它的作者是Elad
"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
方法过滤其元素。筛选器方法可以接受回调(闭包,函数名为字符串,…)。数组元素被迭代,每个元素都被传递给回调函数,并且只有在回调返回值等于布尔真值时才被接受
希望它有帮助结果将是匹配的数据(文本),如果您说要匹配零或一,并且它匹配零,则没有要返回的数据,而undefined就是结果 我推测,为什么保留匹配的设计原因是因为它保持了索引的一致性,所以您仍然可以按预期访问它们。通过这种方式,您可以通过检查
未定义
,有效地测试“是否匹配任何内容”
如果要将其从阵列中删除,则可以使用过滤器
功能,例如:
arr = arr.filter(function(e){return e});
()
未定义的
表示当数字存在时,您尝试匹配的最后一个数字应该位于的位置(per\s?(\d+)
)
为了在任何情况下保持连贯性,您都应该保留它,并可能像处理1
一样处理它
如果您喜欢空字符串,可以尝试以下方法:
"GBP 5 per hour".match(/([a-z]{3}) (\d+(?:\.\d+)?) per\s?([\d]*)\s?(hours?|days?|minutes?)/im)
我不知道是否可以不使用它直接获取数组(我的意思是不过滤数组)。本例中的回调函数测试传递的元素的类型,并接受类型不同于“undefined”的每个元素。请看我下面的示例,使用回调函数过滤数组值。在本例中,回调函数对传递的元素类型进行测试,并接受和拒绝未定义的元素。希望能有帮助
arr = arr.filter(function(e){return e});
"GBP 5 per hour".match(/([a-z]{3}) (\d+(?:\.\d+)?) per\s?([\d]*)\s?(hours?|days?|minutes?)/im)