如果这个问题在某处得到回答,我深表歉意。如果是,请指出正确的方向。我已经阅读了很多解决方案,但还没有破解!
太...基本上,我需要: 将每个单词的第一个字母移到单词的末尾,然后在单词的末尾添加“ ay”。保留标点符号不变。
到目前为止,这是我的代码:
function pigIt(str) {
var newStr = str.split(" ");
var changed = newStr.map(function(input) {
return input.substring(1) + input.charAt(0) + "ay";
});
changed = changed.join(" ");
return changed;
}
console.log(pigIt('Pig latin is cool'));
如您所见,该代码适用于任何不包含标点符号的输入。大。现在,我可能需要在某个地方添加一个正则表达式以排除标点符号,但我不知道将其放在何处!请帮忙!
答案 0 :(得分:2)
在捕获分隔符时,可以按单词边界/(\W+)/
进行分隔。仅转换单词。然后再加入。
function pigIt(str) {
var newStr = str.split(/(\W+)/); // ['Pig', ' ', 'latin', ',- ',..]
var changed = newStr.map(function(input) {
if (!/\w/.test(input)) return input // keep non word elements as is
return input.substring(1) + input.charAt(0) + "ay";
});
return changed.join("");
}
console.log(pigIt('Pig latin,- is cool!'));
答案 1 :(得分:0)
我认为,因为您将要在处理后将标点符号放回原处,那么最好手动进行所有操作。
一次输入1个字符,并构建一个“字缓冲区”,每次您击中一个非字母字符,然后处理该字缓冲区并附加该非字母字符。
function pigIt(str) {
var process = function(s) {
if (s.length < 2) {
return s;
}
return s.substring(1) + s.charAt(0) + "ay";
};
var result = '';
var buffer = '';
for (var i = 0; i < str.length; i++) {
var c = str[i];
if (c.match(/[a-zA-Z]/i)) {
buffer += c;
} else {
if (buffer.length) {
result += process(buffer);
buffer = '';
}
result += c;
}
}
result += process(buffer);
buffer = '';
return result;
}
var output = pigIt('Pig latin is cool.');
console.log(output);