如何反转字符串中的所有单词 in-place 也反转这些单词在字符串中的位置,同时将标点符号保留在原来的位置

How to reverse all words in a string in-place also reverse those words' place in the string, while keep punctuations in their old place

如果标题不清楚,举个例子: 输入:

'hello  howis.going'

预期输出:

'ginog  siwoh.olleh'.

可以用正则表达式编程吗?

下面是我的代码,

function fn(str) {
  return str.replace(/[^\s.]+/g, function(m) {
    return m.split('').reverse().join('');
  });
 }

 var res = fn('hello  howis.going')
 console.log('result = ', res);

这是我现在的输出:

olleh  siwoh.gniog

您可以做的是创建一个包含字符串中所有单词的数组,反转数组,然后开始用反转数组中的单词替换字符串中的每个单词。

这是一个例子:

function process(s){
  let arr = s.replace(/\W+$/, "").split(/\W+/).reverse();
  let index = 0;
  return s.replace(/\w+/g, function(){
    return arr[index++].split("").reverse().join("");
  });
}

console.log(process("hello  howis.going"));

编辑:添加 .replace(/\W+$/, "") 以防止在字符串末尾包含 non-word 个字符的情况下数组末尾出现空字符串元素。

您可以使用 match 创建一个要移动的字母数组,然后 replace and pop 来自该数组:

function fn(str){
  var moved = /\w/g; // use moved = /[\w ]/g to also move spaces.
  var letters = str.match(moved, '');
  var altered = str.replace(moved, function(){return letters.pop();});
  return altered;
}
    
console.log(fn('hello  howis.going'));
console.log(fn('Also in ... different lengths!'));
console.log(fn('a.bb.ccc.dddd'));

如果你也想移动空格,可以把函数中的第一行改成/[\w ]/g:

function fn(str){
    var moved =  /[\w ]/g;
    var letters = str.match(moved, '');
    var altered = str.replace(moved, function(){return letters.pop();});
    return altered;
}

console.log(fn('hello  howis.going'));
console.log(fn('Also in ... different lengths!'));
console.log(fn('a.bb.ccc.dddd'));