在java中,只为句子中的字母而不是数字或特殊字符反转字符串

在java中,只为句子中的字母而不是数字或特殊字符反转字符串,java,string,java-8,Java,String,Java 8,我想实现一种方法,在只反转句子中的字母[a-zA-Z]而不是数字或特殊字符后返回字符串。必须逐字逐句地倒转。例如:对于1个LCD的25000R,它应该是25000sr rof 1 DCL public class Main { static String reverseWords(String inputString) { String[] words = inputString.split(" "); String reverseString = "";

我想实现一种方法,在只反转句子中的字母
[a-zA-Z]
而不是数字或特殊字符后返回字符串。必须逐字逐句地倒转。例如:对于1个LCD的
25000R
,它应该是
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)); 
}
}  
公共类主{
静态字符串反转记录(字符串输入字符串){
String[]words=inputString.split(“”);
字符串反向限制=”;
for(int i=0;i=0;j--)
{
reverseWord=reverseWord+字字符(j);
}
反向限制=反向限制+反向限制+“”;
}
返回反向限制;
}
公共静态void main(字符串[]args)
{
String str1=“一杯热咖啡的价格为8.00美元,而冷咖啡的价格为45.00美元。”;
System.out.println(reverseWords(str1));
String str2=“一台LCD投影仪的成本为25000卢比。”;
System.out.println(reverseWords(str2));
字符串str3=“8990.33”;
System.out.println(reverseWords(str3));
}
}  
这是我想要的输出: 1临市局fo toh eeffoc标准件8.00,saerehw dloc eeffoc标准件45.00

tI stsoC 25000sr rof 1 DCL Rotchejorp

8990.33

这是我得到的输出: 1个临时市政局,00.8 saerehw dloc eeffoc stsoc.00.54

tI stsoC sr00052 rof 1 DCL.Rotchejorp

33.0998


您只需在空格字符处进行拆分,这使每个非空格字符序列都成为一个“单词”

此任务是正则表达式的
appendReplacement
/
appendTail
循环的典型用例,当预期的替换逻辑太复杂,无法在
字符串上进行简单替换时,您可以始终使用该循环:

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();
}
staticstringreverseewords(stringinputstring){
Matcher m=WORD.Matcher(inputString);
如果(!m.find())返回inputString;
StringBuilder sb=新的StringBuilder(inputString);
做{
对于(intix1=m.start(),ix2=m.end()-1;ix1
您的问题是什么?我将此作为输出-“1 puc fo to h eeffoc stsoc,00.8 saerehw dloc eeffoc stsoc.00.54”而不是“1 puc fo to h eeffoc stsoc 8.00,saerehw dloc eeffoc stsoc 45.00”Pl.将其发布到您的问题上,以获得其他人的帮助。您得到的是什么输出以及您期望的是什么。这不是您使用此代码得到的输出。此代码完全吞没了非单词字符,因此它们不会出现在输出中。除此之外,
new String(reverseString)等表达式
没有意义,因为
reverseString
已经是
字符串了。对不起,我的错。我发布了更新的代码。我试图解决问题,但在发布时没有意识到我对原始代码进行了更改。