除了正则表达式之外,还有其他方法可以删除或忽略 JS 中的标点符号吗?

Other ways to remove or ignore punctuation in JS besides regex?

我正在解决一些初学者 Coderbyte 问题,我遇到了一个有趣的困境。问题是:

"使用 JavaScript 语言,让函数 LongestWord(sen) 接受传递的 sen 参数和 return 字符串中最大的单词。如果有两个或更多单词同样的长度,return第一个字来自 该长度的字符串。忽略标点符号并假设 sen 不会为空。”

这是我的代码:

function LongestWord(sen) {
    var myArray = sen.split(" ");
    var lengthOfSubstring = 0;

    for (var i = 0; i < myArray.length; i++) {
        if (myArray[i].length > lengthOfSubstring) {
            lengthOfSubstring = myArray[i].length;
            sen = myArray[i];
        }
    }
    return sen;
}

console.log(LongestWord("Argument goes here"));

除非参数包含标点符号,否则我的代码通过了所有测试。无论如何要删除或忽略它?每次搜索都会出现正则表达式和非常吓人的语法哈哈

编辑:在 @Markus 提供的 sen 参数上使用了 match() 方法

function LongestWord(sen) {
    var myArray = sen.match(/[a-z]+/gi);
    var lengthOfSubstring = 0;

    for (var i = 0; i < myArray.length; i++) {
        if (myArray[i].length > lengthOfSubstring) {
            lengthOfSubstring = myArray[i].length;
            sen = myArray[i];
        }
    }
    return sen;
}
console.log(LongestWord("Argument goes here"));

没有正则表达式:

function LongestWord(sen) {
    var wordStart = -1;
    var bestWord = null;
    var bestLength = 0;

    for (var i = 0; i < sen.length; i++) {
        var ch = sen[i];
        if ('a' <= ch && ch <= 'z' || 'A' <= ch && ch <= 'Z')
        {
            if (wordStart === -1)
            {
                wordStart = i;
            }
        }
        else
        {
            if (wordStart !== -1)
            {
                var word = sen.substring(wordStart, i);
                if (word.length > bestLength)
                {
                    bestLength = word.length;
                    bestWord = word;
                }
                wordStart = -1;
            }
        }
    }
    if (wordStart !== -1)
    {
        var word = sen.substring(wordStart);
        if (word.length > bestLength)
        {
            bestLength = word.length;
            bestWord = word;
        }
        wordStart = -1;
    }
    return bestWord;
}

使用正则表达式:

function LongestWord(sen) {
    var bestWord = null;
    var bestLength = 0;

    var matches = sen.match(/[a-z]+/gi);
    for (var i = 0; i < matches.length; i++)
        var word = matches[i];
        if (word.Length > bestLength)
        {
            bestLength = word.Length;
            bestWord = word;
        }
    }
    return bestWord;
}

这是一种不用正则表达式的方法,使用非常紧凑的过滤函数:

function longestWord(sen) {
    // We are using Python's string.punctuation set.
    var punct = '!"#$%&\'()*+,-./:;<=>?@[\]^_`{|}~';
    var wordArr = sen.split(' ');
    var filteredWordArr = wordArr.map(function (word) {
        return word.split('').filter(function (ch) {
            return punct.indexOf(ch) < 0;
        }).join('');
    });
    return wordArr[filteredWordArr.reduce(function (maxIdx, currWord, i, fwa) {
        return currWord.length > fwa[maxIdx].length ? i : maxIdx;
    }, 0)];
}

console.log(longestWord("Çüéâäâ, wouldn't you like to play?")); // wouldn't

这个函数returns过滤后长度最大的未经过滤的词,与其他过滤后的词进行比较,这可能就是你想要的。我注意到此代码的旧版本返回 "wouldnt" 而不是 "wouldn't",但现在已修复。

不过,使用正则表达式确实可以稍微清理此代码。它可以帮助您用单个正则表达式替换操作替换拆分、过滤和连接操作:

function longestWord(sen) {
    var punct = /[!"#$%&'()*+,\-.\/\:;<=>?@[\]^_`{\|}~]/g;
    var wordArr = sen.split(' ');
    var filteredWordArr = wordArr.map(function (word) {
        return word.replace(punct, '');
    });
    return wordArr[filteredWordArr.reduce(function (maxIdx, currWord, i, fwa) {
        return currWord.length > fwa[maxIdx].length ? i : maxIdx;
    }, 0)];
}

没有正则表达式

function LongestWord(sen) {
    var punct = '\.,-/#!$%^&*;:{}=-_`~()'.split('');

    var words = sen.split(" ").map(function(item) {
        return item.split('').filter(function(char) {
            return punct.indexOf(char) === -1;
        }).join('');
    });

    return words.reduce(function(a, b) {
        return a.length > b.length ? a : b;
    });
}

使用正则表达式

function LongestWord(sen) {
    return sen.split(" ").map(function(word) {
        return word.replace(/[\.,-\/#!$%\^&\*;:{}=\-_`~()]/gi, '');
    }).reduce(function(a, b) {
        return a.length > b.length ? a : b;
    });
}