这是我们的代码:
import java.io.File;
import java.io.FileNotFoundException;
import java.util.*;
import java.util.regex.Matcher;
import java.util.regex.Pattern;
public class reverse {
public static void main(String[] args) throws FileNotFoundException {
File fil = new File("textFile.txt");
Scanner scan = new Scanner(fil);
while (scan.hasNext()) {
String in = scan.nextLine();
in = new StringBuffer(in).reverse().toString();
Pattern replace = Pattern.compile("\\W+");
Matcher matcher = replace.matcher(in);
System.out.println(matcher.replaceAll("\t"));
}
}
}
在我们的 textFile.txt 中,我们在不同的行中有字母、数字和单词。我们想以相反的顺序打印出来。因此,如果一行是:是的,4 巧克力牛奶。我们要打印出来: milk Chocolate 4 是的。
我们的代码以相反的方式打印单词,所以 yes 变成了 sey。我们不希望它变成这样,但不知道如何改变它。我们一直在考虑创建一个堆栈,但我们不知道它如何在没有 Pattern 和 Matcher 的情况下一起工作。
最佳答案
您不应该反转您阅读的行,而是将该行拆分为一个集合并将其反转。 你所做的是反转字符,所以你得到这个:
Yes, 4 Chocolate milk -> klim etalocohC 4 , seY
如果将行拆分为 ["Yes","4","Chocolate milk"]
您可以反转该数组/列表。
问题是:我猜你想保留 Chocolate milk
按照这个顺序,所以你需要定义哪些词属于一起。如果您的输入始终是 <words>, <number> <words>
你可以拆分 ,
首先,分开第一个<words>
然后在余数的第一个空格上拆分数字和第二个 <words>
.
更新:试试这个:
String input = "Yes sir, 4 Chocolate milk";
//Pattern is:
//- one or more words separated by whitespace as group 1: ((?:\\w+\\s*)+)
//- a comma
//- optional whitespace: \\s*
//- an integer number as group 2: (\\d+)
//- optional whitespace \\s*
//- an arbitrary rest (which might contain anything) as group 3: (.*)
Pattern p = Pattern.compile( "((?:\\w+\\s*)+),\\s*(\\d+)\\s*(.*)" );
Matcher m = p.matcher( input );
List<String> list = new ArrayList<String>();
while(m.find()) {
list.add( m.group( 1 ) );
list.add( m.group( 2 ) );
list.add( m.group( 3 ) );
}
Collections.reverse( list );
for( String s : list) {
System.out.println(s);
}
输出应该是
Chocolate milk
4
Yes sir
请注意,这取决于您输入的布局,并且只是为了提供一个开始。您还需要将其与其他模式匹配逻辑集成。
关于Java - 反转字符串中的单词,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7875850/