不影响任何特殊字符的字符串反转

5

我想要反转字符串

"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(" ");

你认为你的代码是做什么用的? - Sverri M. Olsen
你想要翻转的是单词还是整个字符串? - OliverRadini
尝试反转每个单词 + 转义和取消转义每个单词 - Praveen
7个回答

11

从你的正则表达式来看,似乎你对“特殊字符”的标准是除了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@rin lets-code",那么我应该得到输出"yM! eman.si@nir edoc-stel"而不是"yM! eman.si@nir stel-edoc"。"lets-code"必须被识别为一个单词。 - rkkkk
@Rinkukumari - 只需在字符组中包含连字符:/[a-z-]+/gi。请注意,单词字符匹配\w不包括连字符,但包括数字,因此您对“单词”的解释与其他人不同(并不是说您错了,只是不同)。;-) - RobG

4

这里还有一种方法我们可以做到相同的效果:

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!$"));


1
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"));

0

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)

0

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&***(

0

Ruby解决方案:

[46] pry(main)> "My! name.is@rin"
=> "My! name.is@rin"
[47] pry(main)> "My! name.is@rin".gsub(/\w+/) { |word| word.reverse }
=> "yM! eman.si@nir"

-1
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)
使用一种简单的方法,遍历字符串两次。如果遇到特殊字符,则直接继续。否则交换字母数字字符。使用 x.isalpha() 检查字母数字字符。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接