【问题标题】:Reversing string without affecting any special characters反转字符串而不影响任何特殊字符
【发布时间】:2015-10-16 07:47:24
【问题描述】:

我想反转字符串

"My! name.is@rin"

我的输出必须是

"yM!  eman.si@nir"

我编写了以下代码,输出为“yM eman si nir” 请解决问题:

return str = stringIn.split("").reverse().join("").split(/[^a-zA-Z]/g).reverse().join(" ");

【问题讨论】:

  • 你认为你的代码是做什么的?
  • 是要反转的单词还是整个字符串?
  • 尝试反转每个工作 + 转义和取消转义每个单词

标签: javascript regex


【解决方案1】:

从您的正则表达式看来,您对“特殊字符”的标准似乎不是字母 A 到 Z。

您可以将String.prototype.replace 与正则表达式一起使用来匹配字母序列,然后提供替换函数以在替换之前修改匹配项,例如

var stringIn = 'My! name.is@rin';
var rev = stringIn.replace(/[a-z]+/gi, function(s){return s.split('').reverse().join('')});
document.write(rev); // yM! eman.si@nir

【讨论】:

  • 如果我输入“My!name.is@rinlets-code”我会得到输出“yM!eman.si@nir edoc-stel”而不是“yM!eman.si@ nir stel-edoc”。 “lets-code”必须被识别为一个单词
  • @Rinkukumari — 只需在字符组中包含连字符:/[a-z-]+/gi。请注意,单词字符匹配\w 不包含连字符但包含数字,因此您对“单词”的解释与其他人不同(不是说您错了,只是不同)。 ;-)
【解决方案2】:

这是我们可以做同样的另一种方法:

function isLetter(char){
    return ( (char >= 'A' &&  char <= 'Z') ||
             (char >= 'a' &&  char <= 'z') );
}    

function reverseSpecialString(string){
    let str = string.split('');
    let i = 0;
    let j = str.length-1;
    while(i<j){
        if(!isLetter(str[i])){
            ++i;
        }
        if(!isLetter(str[j])){
            --j;
        }
        if(isLetter(str[i]) && isLetter(str[j])){
            var tempChar = str[i];
            str[i] = str[j];
            str[j] = tempChar;
            ++i;
            --j;
        }
    }
    return str.join('');
}

document.write(reverseSpecialString("Ab,c,de!$"));

【讨论】:

    【解决方案3】:
    let check=(str)=>{
        let pat=/[a-zA-z]/igm;
        if(str.match(pat)){
            return true
        }else{
            return false
        }
    }
    
    let r=(str)=>{
        let arr=str.split('');
        let l=0;
        let r=arr.length-1;
        while(l<r){
            if (!check(arr[l])){
                l++;
            }else if(!check(arr[r])){
                r--;
            }else{
                let tmp=arr[l];
                arr[l]=arr[r];
                arr[r]=tmp;
                l++;
                r--;
            }
        }
     return arr.join('');
    }
    
    document.write(r("p@$$word"));
    

    【讨论】:

      【解决方案4】:

      Pythonic 方法,在一行中回答。

      import re
      
      def reverseOnlyString(text_in):
          return ("".join([tup[0][::-1] + tup[1] for tup in re.findall(r'(\w*)(\W*)', text_in)]))
      
      my_string = 'my name@#$ is 123 Test'
      print(reverseOnlyString(my_string))
      
      my_string = "My name is Tom Hank"
      print(reverseOnlyString(my_string))
      my_string = "MynameisTom Hank"
      print(reverseOnlyString(my_string))
      my_string = "%$%^^ *&&^ABC5443&***("
      print(reverseOnlyString(my_string))
      
      ==>ym eman@#$ si 321 eliN
      ==>yM eman si moT knaH
      ==>moTsiemanyM knaH
      ==>%$%^^ *&&^3445CBA&***(
      

      【讨论】:

        【解决方案5】:

        没有正则表达式的 Pythonic 方法:

        p = "a!!!b.c.d,e'f,ghi"
        q = ''.join([i for i in p if i.isalpha() ])[::-1]
        
        
        r = ''
        for i in range(len(p)):
            if p[i].isalpha():
                r+=q[0]
                q =q[1::]
            else:
                r+=p[i]
        print(r)
        print(p)
        

        【讨论】:

          【解决方案6】:
          def reverse(str1):
              l1=list(str1)
              n=len(str1)
              l=0
              r=n-1
              while l<r:
                  if not l1[l].isalpha():
                      l+=1
                  elif not l1[r].isalpha():
                      r-=1
                  else:
                      l1[l],l1[r]=l1[r],l1[l]
                  l+=1
                  r-=1
              return ''.join(l1)
          
          str1="a,b$c"
          q=reverse(str1)
          print(q)
          

          c,b$a

          使用一种简单的方法来遍历字符串两次。 如果遇到特殊字符,则继续。否则交换字母数字字符。使用 x.isalpha() 完成对字母数字字符的检查

          【讨论】:

            猜你喜欢
            • 1970-01-01
            • 2022-07-20
            • 1970-01-01
            • 2022-09-24
            • 2021-07-09
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 2015-05-01
            相关资源
            最近更新 更多