我正在尝试创建一个java程序,允许我打开路径在参数中的文件
一切都在我的路径上工作:“C:\ telephone1 \”和文件夹的名称是“telephone1”
但如果文件夹的名称是“téléphone1”(重音),我不想用我的脚本找到它。
这是对程序说话的一种方式:你必须测试:
- telephonne
- télephonne
- téléphonne
- téléphonné
- tèlephonne
- tèlèphonne
- tèlèphonnè
- télèphonne
- ......
然后脚本会找到它
?
答案 0 :(得分:2)
使用java.text.Normalizer:
删除重音符号s = Normalizer.normalize(s, Normalizer.Form.NFKD).replaceAll("\\p{M}", "");
这会将单个代码点é
替换为e
加零宽度急性标记。然后删除所有“组合变音标记”。
规范化:因为单个“字符”存在不同的Unicode代码点序列。
虽然可以比较两个这样的标准化文本,但可以按如下方式制作模式。
String regexPattern = Pattern.quote(s)
.replace("e", "[eéèê]")
.replace("u", "[ùúû]")
.replace("oe", "(oe|œ)")
... ;
Pattern pattern = Pattern.compile(regexPattern);
答案 1 :(得分:2)
使用强度为java.text.Collator
的PRIMARY
来过滤java.nio.file.DirectoryStream
:
import java.io.IOException;
import java.nio.file.DirectoryStream;
import java.nio.file.Files;
import java.nio.file.Path;
import java.nio.file.Paths;
import java.text.Collator;
import java.util.Iterator;
import java.util.Locale;
public class CollatorForPaths {
static final Path root = Paths.get("C:");
static final Collator collator;
static {
collator = Collator.getInstance(Locale.FRANCE);
collator.setDecomposition(Collator.CANONICAL_DECOMPOSITION);
collator.setStrength(Collator.PRIMARY);
}
static Path findPath(final String name) throws IOException {
try (final DirectoryStream<Path> stream = Files.newDirectoryStream(root, entry -> collator.equals(name, entry.getFileName().toString()))) {
final Iterator<Path> iterator = stream.iterator();
return iterator.hasNext() ? iterator.next() : null;
}
}
public static void main(final String... args) throws IOException {
System.out.println(findPath("telephonne"));
}
}
答案 2 :(得分:1)
好的,所以这绝对可以通过一些正则表达式和FileFilter进行清理和优化。查看File here的文档。您可以创建FileFilter
并将其传递到File.listFiles(fileFilter)方法,以仅检索要执行某些操作的目录。但是,只是为了创建一个选项的简单示例,我正在进行基本的String解析,然后手动创建我的File对象。
下面的程序将创建我们所需目录的File
对象。然后它会查看该目录中的所有文件(如果有的话)。它将为从原始父目录中找到的每个子项创建一个新的File
对象,如果它是一个目录,它会将所有特殊e字符交换为常规e字符,并检查它是否以{ {1}},然后执行一些逻辑。在这种情况下,只需打印出原始目录名称。
telephonne
为了向您展示程序所看到的内容,下面列出了我执行程序的目录。
import java.io.*;
public class DirectoryFinder{
public static void main(String args[]){
File dir = new File("/Users/myuser/Downloads/sojava/");
String[] children = dir.list();
if (children != null && children.length > 0) {
for(int i = 0; i < children.length; i++) {
File file = new File(children[i]);
if (file.isDirectory()) {
String modifiedName = file.getName().toLowerCase();
modifiedName = modifiedName.replaceAll("é", "e");
modifiedName = modifiedName.replaceAll("è", "e");
if (modifiedName.startsWith("telephonne")) {
// do some stuff with file.getName() which is the original file name
System.out.println("file.getName(): " + file.getName());
}
}
}
}
}
}
我希望这有助于指明你正确的方向。
答案 3 :(得分:0)
也许可以制作字典,如果脚本没有找到重音,请尝试用“Téléphonne”替换“Telephonne”(保存在变量中的单词)。
答案 4 :(得分:0)
我终于找到了怎么办!这是我的代码,以防有人需要它:
package ouvrirDossier;
import java.awt.Dimension;
import java.io.File;
import java.io.IOException;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.regex.Matcher;
import java.util.regex.Pattern;
import javax.swing.JFrame;
import javax.swing.JLabel;
import javax.swing.JOptionPane;
public class ouvrirDossier{
private static String path;
private static final JOptionPane optionPane = new JOptionPane(
"The only way to close this dialog is by\n"
+ "pressing one of the following buttons.\n"
+ "Do you understand?",
JOptionPane.QUESTION_MESSAGE,
JOptionPane.YES_NO_OPTION);
public static void main(String[] args){
// ON CREE LE CHEMIN D'ACCES AU DOSSIER EN COLLANT TOUT LES BOUS.
path = "A:\\";
if(args.length>0){
int cpt;
for(cpt = 1;cpt<args.length;cpt++){
if( cpt == 0)
path += args[cpt].replaceAll(";"," ");
else{
if(cpt==1)
path += args[cpt].replaceAll(";"," ");
else
path += "\\"+args[cpt].replaceAll(";"," ");
}
}
}
//ouvrirAlerte(path);
// ON REGARDE SI LE DOSSIER EXISTE
if(ouvrirDossier(path) == false){
String chemin = "";
String cheminTemp = "";
boolean okMatch = false;
boolean trouve = false;
String[] etages = path.split("\\\\");
outerloop:
for(int a=1; a<etages.length; a++){
if(trouve == false){
chemin = "";
cheminTemp = "";
for(int b=0; b<a; b++){
chemin += etages[b]+"\\";
}
//System.out.println(chemin);
File theDir = new File(chemin);
if(!theDir.exists()){
for(int b=0; b<a-1; b++){
cheminTemp += etages[b]+"\\";
}
File theDirTemp = new File(cheminTemp);
//System.out.println(chemin);
//System.out.println(cheminTemp);
ArrayList<String> noms = new ArrayList<String>(Arrays.asList(theDirTemp.list()));
okMatch = false;
for(int c=0; c<noms.size(); c++){
String regexPattern = Pattern.quote(etages[a-1])
.replace("é", "[eéèêë]")
.replace("u", "[ùúûü]")
.replace("oe", "(oe|œ)")
.replace("a", "[aàâä]");
Pattern pattern = Pattern.compile(regexPattern);
Matcher matcher = pattern.matcher(noms.get(c));
while(matcher.find()){
okMatch = true;
etages[a-1] = noms.get(c+1);
/*
String test = "";
for(int e=0; e<etages.length; e++){
test += etages[e]+"\\";
}
*/
a--;
//System.out.println(test);
}
}
if(!okMatch)
break outerloop;
}
if(a == etages.length-1 && theDir.exists())
trouve = true;
}
}
if(trouve){
ouvrirDossier(chemin);
}
else{
int selectedOption = JOptionPane.showConfirmDialog(null,
"Le dossier que vous tentez d'ouvrir ("+path+")ne semble pas exister, voulez vous le créer ?",
"SPB - Le dossier n'existe pas",
JOptionPane.YES_NO_OPTION);
if (selectedOption == JOptionPane.YES_OPTION){
if(args[0].equals("T")){
new File(path).mkdirs();
new File(path+"/Support/Doc").mkdirs();
new File(path+"/Support/Dev").mkdirs();
// ------------->
new File(path).mkdirs();
new File(path+"/Courriel").mkdirs();
new File(path+"/Courriel/Entrant").mkdirs();
new File(path+"/Courriel/Sortant").mkdirs();
new File(path+"/Document de Base").mkdirs();
new File(path+"/Document Intermediaire").mkdirs();
new File(path+"/Donnee").mkdirs();
new File(path+"/Donnee/Dsr").mkdirs();
new File(path+"/Donnee/Dsi").mkdirs();
new File(path+"/Livrable").mkdirs();
new File(path+"/Programme").mkdirs();
}
else if(args[0].equals("P")){
new File(path).mkdirs();
new File(path+"/Support/Doc").mkdirs();
new File(path+"/Support/Dev").mkdirs();
}
ouvrirDossier(path);
}
}
}
}
private static boolean ouvrirDossier(String chemin){
File theDir = new File(chemin);
//System.out.println(chemin);
if(theDir.exists()){
// SI OUI ON L'OUVRE
try{
Runtime runTime = Runtime.getRuntime();
Process process = runTime.exec("explorer "+chemin);
}
catch (IOException e){
e.printStackTrace();
}
return true;
}
return false;
}
public static void ouvrirAlerte(String texte){
JFrame frame = new JFrame("SPB");
frame.setPreferredSize(new Dimension(1270, 100));
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
JLabel label1 = new JLabel(texte);
frame.add(label1);
frame.pack();
frame.setLocationRelativeTo(null);
frame.setVisible(true);
}
public int nbLettre(char lettre, String mot){
int resultat = 0;
for(int a=0; a<mot.length(); a++){
if(mot.substring(a, a+1).equals(lettre)){
resultat++;
}
}
return resultat;
}
}
真的感谢Kyle,Joop Eggen,xehpuk 以及所有帮助我的人:-D