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 您没有发布您用来获取用户输入的类。我觉得这就是问题发生的地方。我用 BufferedReaderInputStreamReader 类尝试了你的正则表达式,输出很好:

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:在正则表达式查询中使用占位符的主要内容,如果未能解决你的问题,请参考以下文章

如何使用正则表达式匹配从 xml 文件中搜索和替换包含占位符标记的文本。 VB.net 或 C#

正则表达式 regular expression

js正则表达式替换捕获内容

ES6 字符串&正则表达式

java转义符和正则表达式转义符

[Study]Java 版正则表达式