Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/429.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript 如何摆脱;“未定义”;在regexp结果中?_Javascript_Regex - Fatal编程技术网

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)