gpt4 book ai didi

Java 通配符替换

转载 作者:行者123 更新时间:2023-12-02 11:57:07 26 4
gpt4 key购买 nike

我有一个文本字段,要求用户输入信息。

JTextField data = new JTextField();

我有一个要求,如果用户输入*。那么当我搜索数据时,它应该被视为正则表达式通配符。

我正在循环访问一系列文件并逐行读取每一行。

for(int i = 0; i < files.length; i++) {
BufferedReader reader = null;

try {
reader = new BufferedReader(new FileReader(files[i]));
String text = null;

while ((text = reader.readLine()) != null) {
if(text.contains(data) return text; // Line that requires wildcard check
}
} catch(IOException e) {
e.printStackTrace();
} finally{
try {
if (reader != null) {
reader.close();
}
} catch (IOException e) {}
}
}

我怎样才能实现这个通配符检查?我要求使“*”成为用户输入的任何字符。

最佳答案

问题在于搜索字符串可能包含其他在正则表达式中很重要的字符,因此盲目转换 * 是不安全的。至.* .

您需要使用Pattern.quote在搜索字符串的所有部分(星号除外):

String[] parts = data.split("\\*");
Pattern pattern = Pattern.compile(
Stream.of(parts).map(Pattern::quote).collect(Collectors.joining(".*")));

if (pattern.matcher(text).find()) {
return text;
}

对上述陈述进行分解:

  • data.split("\\*")通过与 * 字面匹配的正则表达式分割字符串字符,转换为子字符串数组。例子:
    • "ab*cd"{ "ab", "cd" }
    • "1*2345*67"{ "1", "2345", "67" }
  • Stream.of(parts)创建 Stream来自子字符串数组。
  • map(Pattern:quote)将 Stream 中的每个元素替换为其带引号的等效元素,因此任何正则表达式元字符( * 除外)都将被视为普通字符。因此,"1+1"原始用户输入中的内容实际上会匹配搜索文件中的这三个字符。
  • collect(Collectors.joining(".*"))将流中的元素重新组装成单个字符串,其中 .*在每个引用部分之间。

顺便说一句,您可以避免写 finally通过将 BufferedReader 放入 try-with-resources statement 来阻止:

String[] parts = data.split("\\*");
Pattern pattern = Pattern.compile(
Stream.of(parts).map(Pattern::quote).collect(Collectors.joining(".*")));
Matcher matcher = pattern.matcher("");

for (File file : files) {
try (BufferedReader reader = new BufferedReader(new FileReader(file))) {
String text;
while ((text = reader.readLine()) != null) {
if (matcher.reset(text).find()) {
return text;
}
}
} catch (IOException e) {
e.printStackTrace();
}
}

因为 BufferedReader 实现了 AutoCloseable ,隐式 finally将创建一个 block ,它基本上执行您正在做的事情:尝试关闭 BufferedReader while suppressing关闭尝试可能出现的任何异常。

关于Java 通配符替换,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/47521631/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com