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
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.
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.