如何在不反转标点符号的情况下将字符串反转到位?

时间:2015-12-10 00:32:38

标签: javascript function

我试图反转字符串中的单词而不会对标点符号产生任何影响 这是我目前的代码:

function reverse(str) {
    str = str.split("").reverse().join("");
    str = str.split(" ").reverse().join(" ");
    console.log(str)
}; 

reverse("This is fun, hopefully.")

上述功能的结果是sihT si ,nuf .yllufepoh
我试图让它像sihT si nuf, yllufepoh.

那样

3 个答案:

答案 0 :(得分:4)

Another approach is to replace all sequences of letters with their reversed forms using replace and a regular expression, e.g.

function reverseWords(s) {
  return s.replace(/[a-z]+/ig, function(w){return w.split('').reverse().join('')});
}

document.write(reverseWords("This is fun, hopefully.")); // sihT si nuf, yllufepoh. 

If you wish to include numbers as word characters (w.g. W3C), then the regular expression should be:

/\w+/g

答案 1 :(得分:2)

将单词边界上的句子分开,这不会消耗任何字符串,
然后使用前瞻\S将每个单词分成字母(带?=的非空格),这样就不会消耗它们了。
反转字母数组,然后重新加入它们,没有分隔符.join("")
并最终重新加入句子,同样没有分隔符,因为当最初在单词边界上分割时,单词之间的空格被保留。

var sentence = "This is fun, hopefully.";
sentence.split(/\b/)
        .map(w => w.split(/(?=\S)/)
                   .reverse()
                   .join("") )
    .join("");

在Chrome的javascript控制台中执行此操作会产生输出:
"sihT si nuf, yllufepoh."

注意这并没有正确处理标点符号的运行。例如,hopefully!?将变为yllufepoh?!,也会反转标点符号。

答案 2 :(得分:0)

你可以用正则表达式做得更好,但这是我刚写的一个简单的解决方案。

function reverse(str){
    var out = '';
    var word = '';
    for (var i=0;i<str.length;i++) {
        // your punctuation characters
        if (',.!? '.indexOf(str[i]) == -1) word += str[i];
        else {
            out += word.split('').reverse().join('');
            out += str[i];
            word = '';
        }
    }
    return out;
}; 

console.log(reverse("This is fun, hopefully."));