我正在编写一个小程序来修剪文件名中字符后面的所有内容。这个字符由用户指定,我希望我的正则表达式的一部分适应它。我的计划是在正则表达式查询中使用占位符,但我遇到了一些麻烦,无法找到有关它的更多信息。 这是我到目前为止的代码:
//get all files (variablepath is a String passed to the method, so is altSep)
File dir = new File(path);
File[] listOfFiles = dir.listFiles();
String regex = "[\\%s\\(\\)]+[\\w\\s]+";
regex = String.format(regex, altSep);
for (File i : listOfFiles) {
String currName = i.getName();
String newName = currName.replaceAll(regex, "");
newName = path + '\\' + newName;
File newFile = new File(newName);
i.renameTo(newFile);
}
是的,它有效,但也会删除空间后面的所有内容。我还担心%s可能与用户可能输入的其他字符匹配。在正则表达式中使用占位符是一个好主意吗? (而且我还在学习Java,所以你可能会发现其他一些可以更容易解决的事情)
旁注:角色本身也必须删除,因为这涉及文件名,所以扩展必须保持不变。
答案 0 :(得分:1)
EDIT2 您没有发布用于获取用户输入的类。我觉得这就是问题发生的地方。我用 BufferedReader 和 InputStreamReader 类尝试了你的正则表达式,输出很好:
import java.io.IOException;
import java.util.ArrayList;
import java.util.regex.*;
import java.io.BufferedReader;
import java.io.InputStreamReader;
public static void main(String[] args) throws IOException {
BufferedReader buffer = new BufferedReader(new InputStreamReader(System.in));
# get filename from user
System.out.println("Enter a filename: ");
String currName = buffer.readLine();
# get altSep from user
System.out.println("Enter a altSep: ");
String altSep = buffer.readLine(); //reader.next();
altSep = altSep.matches("[0-9a-zA-Z]") ? altSep : "\\" + altSep;
# format regex with user input
String regex = "(%s.*)(?=\\.\\w+)";
regex = String.format(regex, altSep);
String newName = currName.replaceAll(regex, "");
# the output
System.out.println(newName);
}
输出:
Enter a filename:
MRS (A\ TP)1(6R)-01.fa
Enter a altSep:
(
MRS .fa
MRS (A\ TP)1(6R)-01.fa
Enter a altSep:
\
MRS (A.fa
MRS (A\ TP)1(6R)-01.fa
Enter a altSep:
6
MRS (A\ TP)1(.fa
MRS (A\ TP)1(6R)-01.fa
Enter a altSep:
P
MRS (A\ T.fa
MRS (A\ TP)1("6R")-01.fa
Enter a altSep:
"
MRS (A\ TP)1(.fa
答案 1 :(得分:0)
尝试更改正则表达式 从 [\\%S \\(\\)] + [\\瓦特\\ S] + 至 [<强> \\\\%S 强> \\(\\)] + [\\瓦特\\ S] +
问题是反斜杠是Java字符串文字和正则表达式中的转义字符。因此,当您使用字符串文字来表示正则表达式时,需要考虑两组转义。如果用户输入转义字符作为输入,则生成的正则表达式可能不是所需的正则表达式,并且可能无法提供所需的输出。