除了正则表达式之外,还有其他方法可以删除或忽略 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;
});
}
我正在解决一些初学者 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;
});
}