gpt4 book ai didi

Java 正则表达式和 PathMatcher

转载 作者:行者123 更新时间:2023-12-01 09:18:24 25 4
gpt4 key购买 nike

我正在用 Java 编写一个应用程序,该应用程序显示文件列表,其中文件名中的第一个单词与用户定义的字符串匹配,然后根据某些首选项删除或重新排列它们。我目前正处于寻找找到我的文件的好方法的阶段。使用this Java Tutorial我最终得到了这样的结果:

Path source = Paths.get(sourceText.getText());
Path dest = Paths.get(destText.getText());

System.out.println("Source:" + source.toString());
System.out.println("P/N: " + partNoText.getText());

String matchString = "glob:**" + partNoText.getText() + "*";

System.out.println("Matching: " + matchString);

fileFinder = new FileFinder(matchString);

try {
Files.walkFileTree(source, fileFinder);
} catch (IOException e1) {
e1.printStackTrace();
}
for (Path path : fileFinder.getResult()) {
System.out.println("Moving: " + path.getFileName());
Path target = Paths.get(dest.toString() + "\\" + path.getFileName());

try {
Files.move(path, target, REPLACE_EXISTING);
} catch (IOException e1) {
e1.printStackTrace();
}
}

其中 FileFinder 扩展了 SimpleFileVisitor 并具有以下访问文件方法:

public FileVisitResult visitFile(Path file, BasicFileAttributes attrs) throws IOException {
System.out.println(file.toString());
System.out.println(fileMatcher.matches(file));
if (fileMatcher.matches(file)) {
result.add(file);
return FileVisitResult.CONTINUE;
}
return FileVisitResult.CONTINUE;
}

我的问题是 glob 将拾取文件名包含零件号的任何文件。以任何方式。因此,如果我的文件名为“12345 RevA Very Big Part 2: Electric Bugaloo”,那么如果用户输入“1”或“123”或“Bugaloo”,则该字符串将匹配。理想情况下,仅当用户输入“12345”时才会匹配。

我尝试将我的 matchString 切换为 "regex: .*"+ partNoText + "\\b",它适用于我从 this other Java Tutorial 修改的正则表达式测试工具。 。我究竟做错了什么? PathMatcher 的工作方式与常规 Matcher 不同吗?

附注任何包含“Text”一词的变量(例如 sourceTextpartNoText)都是 JTextField。希望这是代码中唯一从我剪下来的内容中大部分不清楚的部分。

最佳答案

“PathMatcher 的工作方式与常规匹配器不同吗?”
是的。 PathMatcher 使用文件名globbing[1],而 Matcher 使用正则表达式.

请参阅您链接的教程中的 What Is a Glob? ,并将其与 java.util.regex.Pattern 的文档进行比较。
通配符比正则表达式匹配受到更多限制。

如果您严格遵守严格的文件命名约定,您可能可以使用通配符(我收回之前评论的最后一部分)。

假设您的文件名为
数字部件号 - 空格 - 可选版本和空格 - 描述

也就是说,零件号的位数可以是可变的,但零件号后面的空格是必需的并且始终存在。

因此,您的示例“12345 RevA Very Big Part 2:Electric Bugaloo”适合partNum==12345,revision =“RevA”,description =“Really Big Part 2:Electric Bugaloo”

用户输入部件号P/N: 123作为变量userPN,然后您构建一个全局变量
String glob = userPN + "*"; 导致 glob 等于 "123 *"
这将匹配 12345,如您所愿,因为 3 后面的空格将不匹配 4。

如果文件名中的部件号后面不是必需的空格,但后面的始终是字母顺序,无论是修订版还是说明,您可以构建一个通配为
String glob = userPN + "[A-Z,a-z]*"; 给出 glob = 123[A-Z,a-z]* 这也不会匹配 12345,因为后面必须有字母123 和 4 不在该字符范围内。

您可以使字符范围更加复杂,例如[A-Z,a-z, ]作为可选空格,具体取决于您的需要,但是 这一切实际上都取决于您的文件命名约定。您需要非常精确地陈述该约定并遵守它。

<小时/>

[1] 如果您在调用 FileSystem.getPathMatcher(String) 时将“语法”指定为 regexPathMatcher 可以使用正则表达式而不是通配符。这就像

FileSystem fs = FileSystems.getDefault();
PathMatcher pm = fs.getPathMatcher("regex:\\d{5}\\s.*");

关于Java 正则表达式和 PathMatcher,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/40351842/

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