如何从没有重音的单词中获取所有强调的单词?

时间:2015-07-29 13:18:13

标签: java

我正在尝试创建一个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
- ......
然后脚本会找到它

5 个答案:

答案 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.CollatorPRIMARY来过滤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;
    }
}

真的感谢KyleJoop Eggenxehpuk 以及所有帮助我的人:-D