3
votes

RegEx pour capturer des modèles de nombres non suivis par d'autres caractères

J'utilise C # et je veux capturer IP: PORT avec Regex mais comment le faire ne pas correspondre si après PORT le caractère est : code>?

testez-le ici

Motif: p >

1.22.234.255:8181:u:p // true, it should be false
   1.22.234.255:80 // true
  1.22.234.255    8080 // true
 dddd1.22.234.255       80808 // true

Résultat expiré

(\d{1,3}\.\d{1,3}\.\d{1,3}\.\d{1,3})[:\s]+(\d{2,5})(?!:)


8 commentaires

essayez-vous de faire correspondre les adresses IP?


oui, mais ce n'est pas le problème, il n'a pas besoin d'être une adresse IP valide


Jetez un œil à < code> IPAddress.TryParse () , au lieu d'un Regex


Jetez également un œil à cette question


Je ne valide pas l'adresse IP mais je capture IP: PORT à partir d'une chaîne aléatoire


Cette partie [: \ s] + correspond à ceci :::::: :::: ::::::::::::::::::: :::::::: ::


@sln la chaîne est une liste de proxy et copiée à partir de la page Web, 99,99% il n'y aura pas de telle chaîne: D


@cieunteung - Ce n'est pas une bonne forme de dire à 99,99%, comme sans plomb?


3 Réponses :


0
votes

Essayez d'utiliser deux expressions régulières différentes, ce sera plus simple

Expression 1 pour les espaces:

(\d{1,3}\.\d{1,3}\.\d{1,3}\.\d{1,3})\:(\d{2,5})$

Expression 2 sans espaces, vous devez vous assurer qu'elle a une fin de vie caractère ou / m modificateur si vous avez plusieurs lignes:

(\d{1,3}\.\d{1,3}\.\d{1,3}\.\d{1,3})\s+(\d{2,5})

Correspond à l'un des deux et fusionne les résultats.


1 commentaires

merci, c'est une chaîne aléatoire Je ne peux pas utiliser ^ $ car la valeur pourrait être au milieu et le séparateur devrait être deux points ou un espace [: \ s]



2
votes

Le problème est que votre expression de port (\ d {2,5}) ne saisit pas tous les chiffres. Dans l'expression qui passe de manière inattendue, si vous regardez les groupes de correspondance, ils sont 1.22.234.255 et 818 ( pas 8181 ). L'expression rejette 1.22.234.255:8181 car elle est suivie d'un : , mais considère alors un port à 3 chiffres et accepte 1.22.234.255:818 car le caractère suivant est un 1 et non un : .

Une façon de compenser cela est de changer votre modèle pour rejeter les deux-points et les chiffres :

(\d{1,3}\.\d{1,3}\.\d{1,3}\.\d{1,3})[:\s]+(\d{2,5})(?![0-9:])


0 commentaires

2
votes

Cette expression régulière fonctionne pour tous les cas

(\ d {1,3} \. \ d {1,3} \. \ d {1,3} \. \ d {1,3} ) \ s * (? :: \ s *)? (?

https://regex101.com/r/5faUcx/1

Version lisible

 (                             # (1 start), IP
      \d{1,3} \.
      \d{1,3} \.
      \d{1,3} \.
      \d{1,3} 
 )                             # (1 end)

 \s* 
 (?: : \s* )?
 (?<! \d )

 ( \d{2,5} )                   # (2), Port
 (?! \d | \s* : )


0 commentaires