Comment utiliser java regex pour faire correspondre une ligne


Les données brutes sont:

auser1 home1b
auser2 home2b
auser3 home3b

Je veux faire correspondre une ligne, mais cela ne fonctionne pas en utilisant ^(.*?)$

Cependant, je peux utiliser a(.*?)b pour correspondre user1 home1.

Comment puis-je faire correspondre auser1 home1b

Author: Manos Nikolaidis, 2011-05-26

2 answers

Par défaut, ^ et $ correspondent respectivement au début et à la fin de l'entrée. Vous devrez activer le mode MULTILIGNE avec (?m) , ce qui fait que ^ et $ correspondent au début et à la fin de la ligne:

(?m)^.*$

La démo:

import java.util.regex.*;

public class Main {
    public static void main(String[] args) throws Exception {

        String text = "auser1 home1b\n" +
                "auser2 home2b\n" +
                "auser3 home3b";

        Matcher m = Pattern.compile("(?m)^.*$").matcher(text);

        while (m.find()) {
            System.out.println("line = " + m.group());
        }
    }
}

Produit la sortie suivante:

line = auser1 home1b
line = auser2 home2b
line = auser3 home3b

MODIFIER I

Le fait que ^.*$ ne correspondait à rien est que le . par défaut ne correspond pas à \r et \n. Si vous activez DOT-ALL avec (?s), ce qui fait que le . correspond à ceux de plus, vous verrez la chaîne d'entrée entière appariée:

(?s)^.*$

MODIFIER II

Dans ce cas, cela vous dérange aussi de laisser tomber les ^ et $ et de chercher simplement le motif .*. Puisque . ne correspondra pas à \n, vous vous retrouverez avec les mêmes correspondances lors de la recherche de (?m)^.*$, comme @Kobi l'a légitimement mentionné dans les commentaires.

 46
Author: Bart Kiers, 2011-05-26 18:33:51

On peut aussi utiliser le drapeau MULTILINE,

 Matcher m = Pattern.compile("^.*$",Pattern.MULTILINE).matcher(text);

Cela activera le mode multiligne qui vous donnera le résultat attendu.

 1
Author: ran_0315, 2018-08-21 09:01:22