2 votes

Expression régulière pour trouver deux mots dans une chaîne

Voici mon problème de base : Je lis quelques lignes dans un fichier. Le format de chaque ligne du fichier est le suivant :

John Doe    123

Il y a un onglet entre Doe y 123 .

Je cherche une expression rationnelle qui me permette d'extraire les éléments suivants John Doe . Quelque chose comme scanner.next(regular expression) qui me donnerait le John Doe .

C'est probablement très simple, mais je n'arrive pas à le faire fonctionner. De plus, j'essaie de résoudre ce problème sans avoir à compter sur la présence de l'onglet.

J'ai regardé ici : Expression régulière (regex) pour valider l'entrée : Deux mots avec un espace entre eux . Mais aucune de ces réponses n'a fonctionné. Je n'arrêtais pas d'obtenir des erreurs d'exécution.

Certains codes :

while(inFile.hasNextLine()){
    String s = inFile.nextLine();
    Scanner string = new Scanner(s);
    System.out.println(s); // check to make sure I got the string
    System.out.println(string.next("[A-Za-z]+ [A-Za-z]+")); //This  
                                                //doesn't work for me
    System.out.println(string.next("\\b[A-Za-z ]+\\b"));//Nor does
                                                               //this
 }

1voto

Tim Gostony Points 7276

Êtes-vous obligé d'utiliser des expressions rationnelles pour cela ? Vous pourriez simplement utiliser un split méthode à travers \t sur chaque ligne et prendre le premier ou le deuxième élément (je ne suis pas sûr de ce que vous vouliez dire par "prendre" John Doe).

0voto

mathematical.coffee Points 23150

Il serait utile que vous fournissiez le code que vous essayez et qui donne lieu à des erreurs d'exécution.

Vous pouvez utiliser des expressions rationnelles :

[A-Za-z]+ [A-Za-z]+

si vous avez toujours su que votre nom serait composé de deux mots.

Vous pouvez également essayer

\b[A-Za-z ]+\b

qui correspond à n'importe quel nombre de mots (contenant des alphabets), en veillant à capturer des mots entiers (c'est ce que fait l'attribut ' \b ' est) --> pour renvoyer "John Doe" au lieu de "John Doe " (avec l'espace qui suit). N'oubliez pas que les barres obliques inverses doivent être échappées en Java.

0voto

Bob Kuhar Points 3502

Cela permet d'isoler l'inconnu des autres...

public String isolateAndTrim( String candidate ) {
    // This pattern isolates "John Doe" as a group...
    Pattern pattern = Pattern.compile( "(\\w+\\s+\\w+)\\s+\\d*" );
    Matcher matcher = pattern.matcher( candidate );
    String clean = "";
    if ( matcher.matches() ) {
        clean = matcher.group( 1 );
        // This replace all reduces away extraneous whitespace...
        clean = clean.replaceAll( "\\s+", " " );
    }
    return clean;
}

La parenthèse de regroupement vous permettra de "séparer" la partie nom de la partie chiffre. "John Doe", "Jane Austin", etc. Vous devriez apprendre le regroupement dans RegEx, car cela fonctionne très bien pour des problèmes comme celui-ci.

L'astuce pour supprimer les espaces blancs supplémentaires vient de Comment supprimer les espaces blancs en double dans une chaîne de caractères à l'aide de Java ?

0voto

Jasonw Points 3633

Préférez-vous la simplicité et la lisibilité ? Si c'est le cas, envisagez la solution suivante

import java.io.File;
import java.io.FileNotFoundException;
import java.util.Scanner;

public class MyLineScanner
{

    public static void readLine(String source_file) throws FileNotFoundException
    {
        File source = new File(source_file);
        Scanner line_scanner = new Scanner(source);

        while(line_scanner.hasNextLine())
        {
            String line = line_scanner.nextLine();

            // check to make sure line is exists;
            System.out.println(line); 

            // this work for me             
            Scanner words_scanner = new Scanner(line);
            words_scanner.useDelimiter("\t");           

            while (words_scanner.hasNext())
            {
                System.out.format("word : %s %n", words_scanner.next());
            }
        }

    }

    public static void main(String[] args) throws FileNotFoundException
    {
        readLine("source.txt");

    }

}

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X