【问题标题】: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如何就地反转字符串中的所有单词也反转这些单词在字符串中的位置,同时将标点符号保留在原来的位置
【发布时间】:2018-03-26 04:30:47
【问题描述】:

如果标题不清楚,这里是一个例子: 输入:

'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

【问题讨论】:

  • 你可能会使用正则表达式来查找单词和它们之间的字符,但是你需要更多的逻辑来反转和替换它们,以便将标点符号等保持在句子中的相同位置.
  • 那么,您希望将此函数应用于“你好。我的问题不清楚”...“raelc.nu si noitseuq ym olleh”的结果是什么?
  • @RobG 是的,这就是我在这里发布它的原因。我想看看有什么我忘记的技巧...
  • @JaromandaX emm 这是个好问题,为什么会更容易?
  • 然后/[a-z]+|[^a-z]+/ig 将匹配 a-z 而不是 a-z 的序列来创建一个数组。现在您可以交换单词并将它们反转并将数组与原始位置的标点符号重新连接在一起。

标签: javascript arrays regex string reverse


【解决方案1】:

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

这是一个例子:

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+$/, "") 以防止在字符串末尾包含非单词字符的情况下,数组末尾出现空字符串元素。

【讨论】:

    【解决方案2】:

    您可以使用match 创建要移动的字母数组,然后从该数组中创建replacepop

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2018-06-14
      • 2018-08-28
      • 1970-01-01
      • 2017-04-03
      • 1970-01-01
      • 1970-01-01
      • 2015-12-13
      相关资源
      最近更新 更多