Java:在正则表达式查询中使用占位符

时间:2016-03-18 12:45:52

标签: java regex placeholder

我正在编写一个小程序来修剪文件名中字符后面的所有内容。这个字符由用户指定,我希望我的正则表达式的一部分适应它。我的计划是在正则表达式查询中使用占位符,但我遇到了一些麻烦,无法找到有关它的更多信息。 这是我到目前为止的代码:

//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,所以你可能会发现其他一些可以更容易解决的事情)

旁注:角色本身也必须删除,因为这涉及文件名,所以扩展必须保持不变。

2 个答案:

答案 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字符串文字和正则表达式中的转义字符。因此,当您使用字符串文字来表示正则表达式时,需要考虑两组转义。如果用户输入转义字符作为输入,则生成的正则表达式可能不是所需的正则表达式,并且可能无法提供所需的输出。