J’ai une ficelle
chaîne 1 (sans les guillemets) -> “Le numéro de mon véhicule est le # 8746253, ce qui est vraiment cool”
conditions – Le nombre 8746253, peut être de n’importe quelle longueur et
– le numéro peut également être suivi immédiatement par une fin de ligne.
Je veux grouper 8746253 qui ne devrait pas être suivi d’un point “.”
J’ai essayé,
. * # (\ d +) [^.]. *
Cela me donnera le nombre à coup sûr, mais cela correspondra même s’il y a un point, car [. ^] Correspondra au dernier chiffre du nombre (par exemple, 3 dans le cas ci-dessous)
chaîne 2 (sans les guillemets) -> “la terre est # 8746253.Kms , ce qui est très loin”
Je veux faire correspondre uniquement le type de chaîne 1 et non les types de chaîne 2 .
Pour faire correspondre un nombre quelconque de chiffres après le #
qui ne sont pas suivis d’un point, utilisez
(?<=#)\d++(?!\.)
Le ++
est un quantificateur possessif qui obligera le moteur des expressions rationnelles à ne vérifier que l'apparence (?!\.)
Uniquement après le dernier chiffre correspondant, et ne reviendra pas en arrière s'il y a un point par la suite. Ainsi, toute la correspondance échouera s'il y a un dit après le dernier chiffre d'un bloc de chiffres.
Voir la démo regex
Pour faire correspondre la ligne entière et mettre les chiffres dans le groupe de capture n ° 1:
.*#(\d++)(?!\.).*
Voir cette démo regex . Ou une version sans lookahead:
^.*#(\d++)(?:[^.\r\n].*)?$
Voir une autre démo . Dans cette dernière version, le bloc de chiffres ne peut être suivi que d'une séquence optionnelle d'un caractère qui n'est pas un .
, CR et LF suivaient avec des caractères 0+ autres que les caractères de saut de ligne ( (?:[^.\r\n].*)?
), Puis la fin de la chaîne ( $
).
Cela fonctionne comme vous l’avez décrit
public class MyRegex{ public static void main(Ssortingng[] args) { Pattern patern = Pattern.comstack("#(\\d++)[^\\.]"); Matcher matcher1 = patern.matcher("my car number is #8746253 which is actually cool"); if(matcher1.find()){ System.out.println(matcher1.group(1)); } Matcher matcher2 = patern.matcher("earth is #8746253.Kms away, which is very far"); if(matcher2.find()){ System.out.println(matcher1.group(1)); }else{ System.out.println("No match found"); } } }
Les sorties:
> 8746253 > No match found