Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/441.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 难以将正则表达式与筛选方法匹配_Javascript - Fatal编程技术网

Javascript 难以将正则表达式与筛选方法匹配

Javascript 难以将正则表达式与筛选方法匹配,javascript,Javascript,做一个挑战,要比提供的解决方案复杂得多,但现在我想解决我偶然发现的正则表达式过滤器问题 在函数currentFileExt()的倒数第二行之前,一切正常。我最初计划使用map,但在查看了类似的StackOverflow解决方案后,我认为.filter()更合适。遗憾的是,我似乎无法让过滤器对照我提供的正则表达式进行检查 也许这是我的一个误解,但是我正在使用过滤器来匹配splittoArr数组的每个字符串元素,如果它匹配正则表达式,它应该被过滤。不幸的是,这似乎没有发生 function find

做一个挑战,要比提供的解决方案复杂得多,但现在我想解决我偶然发现的正则表达式过滤器问题

在函数
currentFileExt()
的倒数第二行之前,一切正常。我最初计划使用map,但在查看了类似的StackOverflow解决方案后,我认为
.filter()
更合适。遗憾的是,我似乎无法让过滤器对照我提供的正则表达式进行检查

也许这是我的一个误解,但是我正在使用过滤器来匹配split
toArr
数组的每个字符串元素,如果它匹配正则表达式,它应该被过滤。不幸的是,这似乎没有发生

function findFileName(fileName) {
    let detect = (fileName.match(/\.+/g)) ? currentFileExt() : alert("Please enter");
    return detect;

    function currentFileExt() {
        let toArr = fileName.split('');
        let fileExtArr = [];
        // let validCharacter = new RegExp(/\.[a-z]+/, 'g');
        let validCharacter = /\.[a-z]+/;
        fileExtArr = toArr.filter( (element) => { element.match(validCharacter) });
        return fileExtArr.join('');
    }  
}

findFileName('java.java');

其中一个问题是过滤器回调函数没有返回任何值。为了使用带有主体的箭头函数实现这一点,您需要添加一个
return
关键字,或者更好的方法是删除主体

String#match
也可能不是您要寻找的方法,因为它返回一个匹配数组,如果没有匹配,则返回null。如果使用
RegExp#test
,则会得到一个布尔值,具体取决于字符串是否与正则表达式匹配

因此,以下内容可能适合您的需要:

function findFileName(fileName) {
    const detect = (fileName.match(/\.+/g)) ? currentFileExt() : alert("Please enter");
    return detect;

    function currentFileExt() {
        const toArr = fileName.split('');
        const validCharacter = /\.[a-z]+/;
        const fileExtArr = toArr.filter(element => validCharacter.test(element));
        return fileExtArr.join('');
    }
}

过滤器删除不匹配的元素。所以
['a','b'].filter(i=>i==='a')/['a']
。另外,您正在使用
split(“”)
对每个字符进行拆分,看起来应该是
split(“”)
可能?否则,如果是单个字符,则正则表达式似乎要查找多个字符。此外,“拆分”将删除拆分字符。您可能可以在单个regexp中完成这一切,而无需拆分:
fileName.match(/\.\w+$/i)
。不完全确定您预期的输入和输出是什么。@justin.m.chase您关于按时段分割的看法是正确的,他们提供的解决方案实际上简单得多,只是将分割的内容弹出。然而,我过于复杂的方法将整个过程分割成一个数组,现在我想过滤掉“.”后面的所有内容。这很愚蠢,但我想解决我为自己制造的这个新问题。你为什么要拆分文件名?过滤后,toArr的每个元素的长度正好是
1
,您的正则表达式正试图匹配两个字符
\。
[a-z]+
。在filterok中每次都返回null,然后只需查找点的最后一个索引,然后切掉末端<代码>a='a.b.c';i=a.lastIndexOf('.');return a.slice(i+1)RegExp特别适用于字符串,如果将其拆分为数组,则需要对单个字符使用数组操作Swall,该函数仍然不起作用(在这一点上我并不真正关心,反正我的函数过于复杂),但我非常感谢您的提示和努力。有一个最好的答案,竖起大拇指。