J'essaie de travailler sur des expressions régulières. J'ai un fichier mainframe qui a plusieurs champs. J'ai un analyseur de fichiers à plat qui distingue plusieurs types d'enregistrements en fonction des trois premières lettres de chaque ligne. Comment puis-je écrire une expression régulière où les trois premières lettres sont «CTR».
Début de ligne ou début de chaîne?
/^CTR.*$/
/
= délimiteur^
= début de la chaîneCTR
= CTR littéral$
= fin de chaîne.*
= zéro ou plus de tous les caractères sauf newline
/^CTR.*$/m
/
= délimiteur^
= début de la ligneCTR
= CTR littéral$
= fin de ligne.*
= zéro ou plus de tous les caractères sauf newlinem
= active le mode multiligne, cela définit regex pour traiter chaque ligne comme une chaîne, donc ^
et $
correspondra au début et à la fin de la ligne
En mode multiligne, vous pouvez toujours faire correspondre le début et la fin de la chaîne avec les ancres permanentes \A\Z
.
/\ACTR.*\Z/m
\A
= signifie le début de la chaîneCTR
= CTR littéral.*
= zéro ou plus de tous les caractères sauf newline\Z
= fin de chaînem
= active le mode multiligne
En tant que tel, une autre façon de faire correspondre le début de la ligne serait la suivante:
/(\A|\r|\n|\r\n)CTR.*/
ou
/(^|\r|\n|\r\n)CTR.*/
\r
= retour chariot/ancien saut de ligne Mac OS\n
= saut de ligne/nouvelle ligne Unix/Mac OS X\r\n
= nouvelle ligne Windows
Notez que si vous allez utiliser la barre oblique inverse \
dans une chaîne de programme prenant en charge l'échappement, comme les guillemets doubles php ""
, vous devez d'abord les échapper.
donc pour exécuter \r\nCTR.*
vous l'utiliseriez comme "\\r\\nCTR.*"
^CTR
ou
^CTR.*
modifier:
Pour être plus clair ... ^CTR
correspondra au début de la ligne et à ces caractères ... si tout ce que vous voulez faire est de faire correspondre une ligne elle-même (et avez déjà la ligne à utiliser), c'est tout ce dont vous avez vraiment besoin (mais Dans ce cas, il vaut peut-être mieux utiliser une fonction de type préfabriquée substr()
... ne sais pas quelle langue vous utilisez ...). Mais si vous essayez de faire correspondre la ligne, vous aurez besoin de quelque chose comme .*
ou .*$
ou autre, selon la fonction de langage/expression régulière que vous utilisez ...
Essayez ^CTR.\*
, ce qui signifie littéralement signifie début de ligne, CTR, n'importe quoi .
Ceci sera sensible à la casse , et la définition de la non-sensibilité à la casse dépendra de votre langage de programmation ou utilisera ^[Cc][Tt][Rr].\*
si la non-sensibilité à la casse dans plusieurs environnements est importante.
^CTR.*$
correspond à une ligne commençant par CTR
.
Vous ne savez pas comment appliquer cela à votre fichier sur votre serveur, mais généralement, l'expression régulière correspondant au début d'une chaîne est la suivante:
^CTR
Le ^
signifie le début de la chaîne/ligne
^
Ajoutez la chaîne que vous recherchez (CTR
) à la regex comme ceci:
^CTR
Exemple: regex
Cela devrait suffire!
Toutefois, si vous souhaitez obtenir le texte de toute la ligne dans la langue de votre choix, ajoutez un modèle "match no", .*
:
^CTR.*
Exemple: more regex
Si vous voulez devenir fou, utilisez le matcher end of line
$
Ajoutez cela au motif de regex en croissance:
^CTR.*$
Exemple: devenons fous
Remarque: En fonction de comment et où vous utilisez regex, vous devrez peut-être utiliser un modificateur multiligne pour le faire correspondre à plusieurs lignes. Il pourrait y avoir toute une discussion sur la meilleure stratégie pour extraire les lignes d'un fichier afin de les traiter, et certaines stratégies nécessiteraient ceci:
Indicateur multilignem
(il est spécifié de différentes manières dans différentes langues/contextes)
/^CTR.*/gm
Exemple: nous devions utiliser m on regex101
(? i) ^ [\ r\n] * CTR (? i) - sensible à la casse - Supprimer si sensible à la casse . [\ r\n] - ignorer l'espace et les nouvelles lignes * - 0 ou plusieurs fois la même chose CTR - votre nom commence par string .
Il y a des ambiguïtés dans la question.
Quelle est votre chaîne d'entrée? Est-ce le fichier entier? Ou est-ce une ligne à la fois? Certaines des réponses supposent ce dernier. Je veux répondre à l'ancien.
Que voudriez-vous revenir de votre expression habituelle? Le fait que vous vouliez un vrai/faux sur si une correspondance a été faite? Ou voulez-vous extraire toute la ligne dont le début commence par CTR? Je vous répondrai que vous voulez seulement un vrai/faux match.
Pour ce faire, il suffit de déterminer si le CTR se produit au début d'un fichier ou immédiatement après une nouvelle ligne.
/(?:^|\n)CTR/