web-dev-qa-db-fra.com

Pourquoi ne pas ^ S $ dans Regex correspond à une chaîne comme "commence par s et fin avec s"?

Si ^ correspond au début d'une ligne et $ correspond à la fin d'une ligne, alors pourquoi ne pas ^$ correspond au début et à la fin d'une chaîne comme celle du titre?

Comment faites-vous une telle regex qui correspond à une chaîne comme celle-ci:

starts with s and ends with s
4
Asker321

La raison réside dans la manière dont les correspondances de Regex sont traitées (voir ici , par exemple): la chaîne est évaluée de gauche à droite et, à l'exception des referférences - chaque symbole de la chaîne doit être assorti par un Jeton dans l'expression régulière (qui dans le cas le plus simple est le symbole littéral lui-même), bien que le jeton puisse être implicite grâce aux opérateurs de répétition.

Le point clé est que les expressions régulières ne décrivent pas les "propriétés générales de la chaîne totale" (telle que "démarrage et fin avec s"), mais imposent des règles sur le Niveau de caractère de la chaîne. Donc, votre expression régulière

^s$

moyens: "Début-de-string", suivi de uns et immédiatement suivi de "fin de chaîne". Cela ne correspondrait donc que la chaîne qui consiste en une seule lettre s. Bien que techniquement, ceci est une chaîne de départ et de fin avec s, ce n'est pas ce que vous recherchez.

Si vous souhaitez faire correspondre une chaîne qui commence par s, a des caractères arbitraires entre et se termine par s, vous devez spécifier tous ces éléments explicitement.

Pour le rendre très explicite:

  • Une première itération pourrait ressembler à ceci:
    ^s.*s$
    
    [.____] Cela correspondrait à "chaîne en commençant par s, suivie de zéro ou plus de caractères de tout type (.*), suivi de s à la fin de chaîne.
  • Bien sûr, cela serait non correspondre à la chaîne qui consiste en seulement le caractère s. Donc, dans la deuxième itération, nous ferions la pièce après le premier s optionnel (voir Commentaire de @ user414777): [.____]
    ^s(.*s)?$
    
    [.____] Ceci correspondrait alors "String en commençant par s, suivi d'un zéro ou d'une fois (le code ?)" une sous-chaîne de zéro ou plus de caractères , suivi d'un s '(le contenu du (...)) et se terminant immédiatement après cela ".

Maintenant, comme vous avez suivi votre question avec awk, cela pourrait signifier que vous souhaitez créer une condition pour une règle awk qui ne s'applique que si la ligne ou une chaîne commence et se termine par s. Cela pourrait ressembler à:

awk '/^s/ && /s$/ { ... }'

Avec grep, tel [~ # ~ ~] et [~ # ~] - la construction n'est pas possible nativement (la syntaxe -e regex1 -e regex2 Syntaxe équivaudrait à an [~ # ~ # ~] ou [~ # ~ ~]), mais vous pouvez y parvenir par la tuyauterie:

grep "^s" sourcefile.txt | grep "s$"
44
AdminBee