Extraire une chaine de caractere
Fermébrucine Messages postés 18580 Date d'inscription lundi 22 février 2021 Statut Membre Dernière intervention 16 janvier 2025 - 19 janv. 2023 à 12:26
- Extraire une chaine de caractere
- Caractère ascii - Guide
- Extraire une video youtube - Guide
- Caractere speciaux - Guide
- Caractère spéciaux - Guide
- Chaine tnt gratuite sur mobile - Guide
3 réponses
Modifié le 18 janv. 2023 à 23:42
Bonjour,
Ta regex est correcte, seulement tu as indiqué le commutateur /m de la commande FINDSTR, donc la commande te retourne uniquement le nom du fichier.
Ton étiquette :break est inutile, voilà comment je vois les choses :
@echo off setlocal enableextensions set "file=C:\Users\lucas\Documents\script\test.txt" set "ip=" for /f "tokens=2" %%a in ('findstr /r "[0-9]*\.[0-9]*\.[0-9]*\.[0-9]*" "%file%"') do ( if not defined ip (set "ip=%%a") ) echo Adresse IP est %ip% endlocal pause
19 janv. 2023 à 08:49
Bonjour
Je ne connais pas batch et donc je ne sais pas répondre à ta seconde question.
Par contre, j'ai une remarque sur la regex.
Elle n'est pas assez restrictive pour ne capturer que des ip, voir cet exemple https://regex101.com/r/ot7Qqy/1
Cela dit, si tu es sûr et certain que dans tes fichiers, une série de chiffres séparés par des point sera toujours une IP, elle peut suffire.
Sinon, cette regex étant fortement utilisée, on la trouve partout sur le net https://lite.qwant.com/?q=regex+ip&client=opensearch
19 janv. 2023 à 09:47
Bonjour,
On peut en effet raffiner la Regex pour spécifier que les séries de chiffres entre les points sont non seulement numériques mais obéissent à un format particulier, mais rien ne garantira jamais dans l'absolu qu'il s'agit d'une adresse IP.
FINDSTR retournera la ligne contenant la chaîne recherchée, éventuellement la position de cette chaîne (début ou fin) mais est incapable de savoir si elle représente le deuxième ou le huitième mot (spécifié dans tokens, ici le deuxième).
Autrement exprimé, je n'ai aucun moyen de la rechercher si elle n'est pas à une position fixe, ce qui amène une question subsidiaire: dépendant de par quelle commande est obtenu le fichier texte et dans quel contexte on le souhaite, on pourra alors se servir de la sortie de la commande en question, et non plus de FINDSTR pour retourner le résultat.
Qui plus est, dans un texte qui serait "au kilomètre", cette syntaxe va échouer à retourner plusieurs adresses IP différentes qui y figureraient.
Modifié le 19 janv. 2023 à 10:39
Bonjour brucine,
Effectivement FINDSTR est incapable de savoir la position de la chaîne, cependant on peut contourner ce problème en utilisant une boucle qui va analyser chaque token l'un après l'autre comme ceci :
:routine set "restant=%~1" :boucle for /f "tokens=1,* delims=/= " %%A in ("!restant!") do set "chaine=%%~A" & set "restant=%%~B" echo !chaine! | findstr /r "[0-9]*\.[0-9]*\.[0-9]*\.[0-9]*" >nul && (set "ip=!chaine!" & exit /b 0) if defined restant (goto :boucle)
19 janv. 2023 à 10:39
Bonjour,
J'en suis tout à fait d'accord, je n'ai fait que commenter le script en l'état (même chose pour partir à la chasse de plusieurs IP si c'est la cas).
19 janv. 2023 à 10:51
Bonjour Brucine
mais rien ne garantira jamais dans l'absolu qu'il s'agit d'une adresse IP.
évidemment," Minimi Azabu 192.168.1.1" pourrait très bien correspondre à une adresse postale au Japon (j'ai jamais rien compris à leur système mais en gros c'est des divisions de secteurs successives), mais son format correspond aussi à un IP v4.
Alors 1...1 qui ne correspond pas à une IP v4 est capturé par la regex actuelle, c'était juste cela que je voulais faire remarquer
19 janv. 2023 à 12:26
On peut faire une autre Regex qui vérifie que chaque segment contient de 1 à 3 chiffres sans autre donnée, qu'il ne s'y trouve pas de valeur numérique aberrante concernant une IP (par exemple 964.12.178.453), qu'il n'y a pas de caractère parasite par exemple alphabétique avant ou après (A192...), qui sera moins "mauvais" mais pas non plus garanti 100%.
La seule manière d'avoir une telle garantie est d'extraire les IP réelles via Netstat, Netsh, Ipconfig, Powershell, wmic ou ce qu'on voudra dirigeant cette IP (dont on connaît alors l'emplacement dans la sortie) vers une variable.
19 janv. 2023 à 07:57
Ok je vous remercie ce code fonctionne !! mais je me rends compte que ce code prend en compte une position fixe dans le texte, n'est il pas possible de rechercher librement une chaine de type "ip" dans un texte peut importe sa position ?
Merci de votre aide
19 janv. 2023 à 09:47
Ok dernier question enfaite je cherche à réaliser cela sur un fichier de configuration pour l'application xemelios, ses paramètres sont stockés dans un fichier de conf :
user=xemelios
password=Am/xL6*::
database.url=jdbc\:mysql\://10.55.1.17/xemelios?jdbcCompliantTruncation\=false&dumpQueriesOnException\=true
driver.class=com.mysql.jdbc.Driverv
alidation.query=SELECT
Mon but étant de capturer l'adresse IP présente dans le fichier de configuration et la stocker dans une variable, cette IP peut varier en fonction des fichiers de configuration d'ordinateur
Voilà et tout sa en batch, ce que je demandais précédemment servais pour test
Merci
19 janv. 2023 à 09:53
Comme ça:
for /f "tokens=2 delims=^//" %%a in ('findstr /r "[0-9]*\.[0-9]*\.[0-9]*\.[0-9]*" "%file%"') do (
if not defined ip (set "ip=%%a")
19 janv. 2023 à 09:55
Ok c'est parfait ça me va
Merci ????
Modifié le 19 janv. 2023 à 10:29
C'est possible en faisant preuve d'imagination :