Je recherche une expression régulière.
Exemple de texte
(\d+\.)+\d
Les valeurs extraites / correspondantes doivent être: p >
1 Does not match1 // no match because of an additional digit in the text 12. Does not match // no match because of the dot after 12
Ceux-ci ne doivent pas correspondre:
1 1.1 45.67.21234.31
Jusqu'à présent, mon expression régulière ressemble à ceci:
1 Match 1.1 Match 45.67.21234.3 Match 1 Does not match1 12. Does not match
3 Réponses :
Nous pouvons essayer d'utiliser le modèle d'expression régulière suivant sur chaque ligne:
String line = "45.67.21234.3";
String pattern = "^(?!\\D*\\d[^0-9.]+\\d).*\\b\\d+(?:\\.\\d+)?(?=\\s|$).*$";
Pattern r = Pattern.compile(pattern);
Matcher m = r.matcher(line);
if (m.find()) {
System.out.println("match");
}
else {
System.out.println("no match");
}
Explication:
^ from the start of the line
(?!\D*\d[^0-9.]+\d) assert that two (or more) separate numbers
do not occur in the line
.* then consume anything, up to
\b\d+(?:\.\d+)? an integer, or complete decimal
(?=\\s|$) where either a space or the end of the line follows
.* then consume anything, up to
$ the end of the line
Voici un code Java utilisant ceci pattern:
^(?!\D*\d[^0-9.]+\d).*\b\d+(?:\.\d+)?(?=\\s|$).*$
Je l'ai testé avec toutes vos entrées et il semble fonctionner.
L'utilisation de (\ d + \.) + \ d ne correspondra pas à la première entrée car en utilisant le quantificateur + , il doit correspondre au moins 1 fois à un chiffre et à un point.
Ce que vous pouvez faire, c'est utiliser une ancre ^ pour affirmer le début de la chaîne et utiliser un modèle pour faire correspondre les chiffres, puis répéter la correspondance d'un point et des chiffres zéro ou plusieurs fois. correspond à la première entrée.
Après la correspondance, assurez-vous que les chiffres ne sont pas suivis d'un caractère non blanc. S'il ne peut plus y avoir de chiffres à la suite, vous pouvez utiliser une anticipation négative supplémentaire.
String regex = "^\\d+(?:\\.\\d+)*(?!\\S)(?!.*\\d)";
En Java:
^\d+(?:\.\d+)*(?!\S)(?!.*\d)Démo Regex
Explication
^ Début de la chaîne \ d + (?: \. \ d +) * Correspond à 1+ chiffres suivi d'un motif répétitif pour faire correspondre un point et 1+ chiffres (?! \ S) une recherche négative pour vérifier que ce qui se trouve à gauche n'est pas un caractère non blanc (?!. * \ d) La recherche négative pour vérifier que ce qui se trouve à droite ne contient pas de chiffre Une expression régulière que vous pourriez utiliser est:
// TODO: Give proper method name
String test(String str){
String regex = "^((\\d+\\.)*\\d+) \\D*$";
if(str.matches(regex))
return str.replaceFirst(regex, "$1");
// The `$1` will leave just the match of the first capture group,
// removing everything else we don't need
else
return null;
}
Où le groupe de capture 1 contiendrait votre correspondance.
Explication: p>
^ # Start of the String
( # Open capture group 1:
(\d+\.) # One or more digits, followed by a dot
* # Repeated 0 or more times
\d+ # Followed by 1 or more digits
) # Closing capture group 1
# Followed by a space
\D* # Followed by 0 or more non-digits
$ # Followed by the end of the String
Les ^ et $ nous feront regarder la chaîne entière. Le \ D * s'assurera qu'il n'y a pas de chiffres dans la sous-chaîne après l'espace. Et le \ d + après le (\ d + \.) * s'assure qu'il y a toujours un chiffre de début, avec un ou plusieurs #. avant it (où # est un nombre non négatif).
Pour extraire cette valeur, vous pouvez utiliser cette expression régulière avec un String.matches et .replaceFirst code> comme ceci: p>
^((\d+\.)*\d+) \D*$
Peut-il y avoir autre chose qu'un espace juste avant ou après le match?
Je suppose qu'en utilisant
(\ d + \.) + \ Dvous forcez un point à venir après le chiffre@Thefourthbird Non, un espace est le seul et unique caractère.
Voulez-vous dire comme ça peut-être en utilisant une ancre pour le début de la chaîne?
^ \ d + (?: \. \ d +) * (?! \ S) (?!. * \ d)testCe look prometteur ... Je vais vérifier ça.
Je suggère
^ \ d + (\. \ D +)?.