仅反转句子中字母表的字符串,而不是java中的数字或特殊字符

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了仅反转句子中字母表的字符串,而不是java中的数字或特殊字符相关的知识,希望对你有一定的参考价值。

我想实现一个方法,在一个句子中只反转字母[a-zA-Z]后返回一个字符串,而不是数字或特殊字符。逆转必须逐字完成。例如:对于25000rs for 1 LCD,它应该是25000sr rof 1 DCL

public class Main 
    static String reverseWords(String inputString)  
    String[] words = inputString.split(" ");

    String reverseString = "";

    for (int i = 0; i < words.length; i++) 
    
        String word = words[i];

        String reverseWord = "";

        for (int j = word.length()-1; j >= 0; j--) 
        
            reverseWord = reverseWord + word.charAt(j);
        

        reverseString = reverseString + reverseWord + " ";
    
    return reverseString;

public static void main(String[] args)

    String str1 = "1 cup of hot coffee costs 8.00, whereas cold coffee costs 45.00."; 
    System.out.println(reverseWords(str1));  

    String str2 = "It Costs 25000rs for 1 LCD Projector."; 
    System.out.println(reverseWords(str2)); 

    String str3 = "8990.33"; 
    System.out.println(reverseWords(str3)); 

  

这是我想要的输出:

1我可以预见到stsoc 8.00,saerehw dloc eeffoc stsoc 45.00。

ts stsoC 25000sr rof 1 DCL rotcejorP。

8990.33

这是我得到的输出:

1我可以eeffoc stsoc,00.8 saerehw dloc eeffoc stsoc .00.54

tS stsoC sr00052 rof 1 DCL .rotcejorP

33.0998

答案

你只是在空格字符处分裂,这使得每个非空格字符序列成为“单词”。

此任务是正则表达式MatcherappendReplacement / appendTail循环的规范用例,当预期的替换逻辑对于replaceAll(String regex, String replacement)上的简单String而言太复杂时,您可以使用该循环:

static final Pattern WORD = Pattern.compile("\\pL+"); // class "L" means "letter"

static String reverseWords(String inputString)  
    Matcher m = WORD.matcher(inputString);
    if(!m.find()) return inputString;
    StringBuffer sb = new StringBuffer(inputString.length());
    do 
        m.appendReplacement(sb, new StringBuilder(m.group()).reverse().toString());
     while(m.find());
    return m.appendTail(sb).toString();

(从Java 9开始,此API还支持使用StringBuilder而不是StringBuffer


但在这种特定情况下,操作也可以稍微提高效率:

static String reverseWords(String inputString)  
    Matcher m = WORD.matcher(inputString);
    if(!m.find()) return inputString;
    StringBuilder sb = new StringBuilder(inputString);
    do 
        for(int ix1 = m.start(), ix2 = m.end() - 1; ix1 < ix2; ix1++, ix2--) 
            sb.setCharAt(ix1, inputString.charAt(ix2));
            sb.setCharAt(ix2, inputString.charAt(ix1));
        
     while(m.find());
    return sb.toString();

以上是关于仅反转句子中字母表的字符串,而不是java中的数字或特殊字符的主要内容,如果未能解决你的问题,请参考以下文章

句子反转

句子反转

如何让 Python 循环遍历句子,但它给了我句子中的单词而不是句子中的每个字母? [复制]

练习题三:句子反转

牛客网在线编程:句子反转

不反转数字的字符反转[关闭]