Java: 在正则表达式查询中使用占位符
Java: using placeholders in a regex query
我正在编写一个小程序来修剪文件名中字符后面的所有内容。此字符由用户指定,我希望我的正则表达式的一部分适应该字符。我的计划是在正则表达式查询中使用占位符,但我遇到了一些麻烦,找不到太多关于它的信息。
这是我到目前为止的代码:
//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);
}
是的,它有效,但也会删除 space 后面的所有内容。我还担心 %s 可能与用户可能输入的其他字符匹配。在正则表达式中使用占位符是一个好主意吗? (而且我还在学习 Java 所以你可能会发现其他一些可以更容易解决的事情)
旁注:字符本身也必须删除,因为这涉及文件名,扩展名必须保持不变。
EDIT2 您没有 post 您使用什么 class 来获取用户输入。我感觉这就是问题发生的地方。我用 BufferedReader 和 InputStreamReader classes 尝试了你的正则表达式,输出很好:
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
尝试更改正则表达式
从
[\\%s\\(\\)]+[\\w\\s]+
到
[\\\\%s\\(\\)]+[\\w\\s]+
问题是反斜杠在 Java 字符串文字和正则表达式中都是转义字符。因此,当您使用字符串文字来表示正则表达式时,需要考虑两组转义。如果用户输入转义字符作为输入,则生成的正则表达式可能不是所需的正则表达式,也可能无法提供所需的输出。
我正在编写一个小程序来修剪文件名中字符后面的所有内容。此字符由用户指定,我希望我的正则表达式的一部分适应该字符。我的计划是在正则表达式查询中使用占位符,但我遇到了一些麻烦,找不到太多关于它的信息。 这是我到目前为止的代码:
//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);
}
是的,它有效,但也会删除 space 后面的所有内容。我还担心 %s 可能与用户可能输入的其他字符匹配。在正则表达式中使用占位符是一个好主意吗? (而且我还在学习 Java 所以你可能会发现其他一些可以更容易解决的事情)
旁注:字符本身也必须删除,因为这涉及文件名,扩展名必须保持不变。
EDIT2 您没有 post 您使用什么 class 来获取用户输入。我感觉这就是问题发生的地方。我用 BufferedReader 和 InputStreamReader classes 尝试了你的正则表达式,输出很好:
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
尝试更改正则表达式 从 [\\%s\\(\\)]+[\\w\\s]+ 到 [\\\\%s\\(\\)]+[\\w\\s]+
问题是反斜杠在 Java 字符串文字和正则表达式中都是转义字符。因此,当您使用字符串文字来表示正则表达式时,需要考虑两组转义。如果用户输入转义字符作为输入,则生成的正则表达式可能不是所需的正则表达式,也可能无法提供所需的输出。