除了正则表达式之外,在JS中删除或忽略标点符号的其他方法是什么?

时间:2015-04-26 21:38:51

标签: javascript regex string split punctuation

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

"使用JavaScript语言,让函数LongestWord(sen)获取传递的sen参数并返回字符串中的最大单词。如果有两个或多个长度相同的单词,则返回第一个单词 那个长度的字符串。忽略标点符号并假设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"));

3 个答案:

答案 0 :(得分:2)

没有正则表达式:

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;
}

答案 1 :(得分:1)

这是使用非常紧凑的过滤函数在没有正则表达式的情况下完成它的一种方法:

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

此函数返回经过筛选后具有最大长度的未过滤单词,并与其他过滤单词进行比较,这可能是您想要的。我注意到这个代码的旧版本返回“不会”而不是“不会”,但现在已经修复了。

使用正则表达式会稍微清理一下这段代码。它可以帮助您使用单个正则表达式替换操作替换拆分,过滤和连接操作:

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)];
}

答案 2 :(得分:1)

没有正则表达式

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;
    });
}