Java:在正则表达式查询中使用占位符
Posted
技术标签:
【中文标题】Java:在正则表达式查询中使用占位符【英文标题】:Java: using placeholders in a regex query 【发布时间】:2016-07-05 05:32:20 【问题描述】:我正在编写一个小程序,用于修剪文件名中字符后面的所有内容。这个字符由用户指定,我希望我的正则表达式的一部分适应它。我的计划是在正则表达式查询中使用占位符,但我遇到了一些麻烦,找不到太多关于它的信息。 这是我到目前为止的代码:
//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,所以你可能会发现其他一些可以更容易解决的问题)
旁注:字符本身也必须删除,因为这涉及文件名,扩展名必须保持不变。
【问题讨论】:
为什么不String newName = currName.substring(0, currName.indexOf(character)+1)
?
@Grogi 注意如果java版本
@Grogi 我意识到我在描述问题时不够具体。您的解决方案很棒,但我还需要摆脱给定的角色本身。我编辑了我的问题。
未转义的正则表达式是[\%s\(\)]+[\w\s]+
。这是正确的吗?请注意这里%
不需要转义。
@ccf 正确。那是未转义的版本。我删除了%
处的转义符,但不幸的是它仍然删除了空格而不是所需的字符
【参考方案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
【讨论】:
对不起,我编辑了您对答案的接受。这个答案(特别是 cmets 中的正则表达式((%s.*)(?=\\.\\w+)
)有点帮助,但我发现它不能接受所有字符作为输入(如 ( 字符)。我还稍微编辑了我的问题,这样你就可以看到输入来自哪里从
@TomKral:来自 cmets 的正则表达式对于 (
字符之类的输入失败的原因是,正则表达式对它是文字(还是捕获组开始)感到困惑。所以,我添加了一个根据输入 (altSep) 检查是否需要转义 `\`。请尝试看看它是否符合您的需要。【参考方案2】:
尝试更改正则表达式 从 [\\%s\\(\\)]+[\\w\\s]+ 到 [\\\\%s\\(\\)]+[\\w\\s]+
问题在于反斜杠在 Java 字符串文字和正则表达式中都是转义字符。因此,当您使用字符串文字来表示正则表达式时,需要考虑两组转义。如果用户输入转义字符作为输入,则生成的正则表达式可能不是所需的,也可能不会给出所需的输出。
【讨论】:
以上是关于Java:在正则表达式查询中使用占位符的主要内容,如果未能解决你的问题,请参考以下文章