Ich schreibe eine Anwendung in Java, die eine Liste der Dateien anzeigt, in denen das erste Wort im Dateinamen mit der benutzerdefinierten Zeichenfolge übereinstimmt und sie dann löscht oder neu anordnet, abhängig von einigen Einstellungen. Ich bin gerade dabei, einen guten Weg zu finden, meine Dateien zu finden. Mit this Java Tutorial endete ich mit so etwas wie dies oben:Java Regex und PathMatcher
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();
}
}
wo Filefinder SimpleFileVisitor erstreckt und diese visitFile Methode:
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;
}
Mein Problem dabei ist, dass die glob jede Datei abholt, wo der Dateiname enthält die Teile-Nr. in irgendeiner Weise. Wenn meine Datei also "12345 RevA Really Big Part 2: Elektrisches Bugaloo" heißt, würde die Zeichenfolge übereinstimmen, wenn der Benutzer "1" oder "123" oder "Bugaloo" eingegeben hätte. Idealerweise würde es nur passen, wenn der Benutzer "12345" eingegeben hätte.
Ich habe versucht, meine MatchString zu "regex: .*" + partNoText + "\\b"
, die in der Regex-Test-Kabelbaum ich geändert von this other Java Tutorial funktioniert. Was mache ich falsch? Funktioniert PathMatcher
anders als ein normales Matcher
?
P.S. Jede Variable, die das Wort "Text" enthält, wie sourceText
und partNoText
sind JTextFields. Hoffentlich ist das der einzige Teil des Codes, der größtenteils unklar ist von dem, was ich herausgeschnitten habe.
Dateiname _globbing_ ist _ ** nicht ** _ ein regulärer Ausdruck; Globbing ist viel begrenzter als Regex. Auch, 'foo *' als ein Glob passt foo-with-away-after-after, das Äquivalent als Regex wäre 'foo. *' = Foo, gefolgt von jedem einzelnen Zeichen '.' null-oder-mehr-mal' * ' –
_ "Im Idealfall würde es nur passen, wenn der Benutzer" 12345 "eingegeben hätte." _ Ist Teilenummer _always_ der erste Teil des Dateinamens? Sind alle Teilenummern _exactly_ 5 Ziffern? Ist die Teilenummer _always_ gefolgt von einem Leerzeichen? Eine genaue Definition kann Ihnen helfen, eine gute Regex zu finden. Ich glaube nicht, dass Globbing es in diesem Fall tun würde, obwohl Sie den Match-Space reduzieren könnten und dann das, was Globbing gefunden hat, wiederfinden. –
@StephenP Für Ihren ersten Kommentar verstehe ich, dass Globbing und Regex beide unterschiedliche Möglichkeiten sind, generalisierte Strings zu erzeugen, mit denen sie übereinstimmen. Sie können aus dem unteren Teil meiner Frage sehen, dass ich aufgrund seiner Beschränkungen entschied, von Globbing zu Regex zu wechseln –