2017-09-13 2 views
0

Je demande tcl regex à ces 2 données, je voulais extraire les données 2e colonne:TCL regexp pour détecter non-espaces

1: Common point: rt123_345_no/qwe_rty/sdf34x56/CFR 
2: Common point: NA 

Ce regex fonctionne pour la 1ère données, mais ne fonctionnera pas pour 2 données:

regexp -inline -expanded -- {Common\spoint:\s+?(\S+)\s+} $line 

Je ne comprends pas pourquoi l'expression régulière ne fonctionnera pas. S'il vous plaît donnez votre avis.

Répondre

2

Il y a deux questions:

  • Il n'y a pas d'espace après NA, donc, le dernier \s+ échouera le match ici par tous les moyens
  • Le motif paresseux \s+? définit la greediness pour la branche, et le \S+ se comportera comme \S+?, en capturant un seul N de NA puisque le quantificateur paresseux +? rend le moteur de regex correspondre à peu de caractères correspondant au motif quantifié que possible.

Utilisez

Common\spoint:\s+(\S+) 
+0

je mettrais un '\ y' sur la fin de ce RE pour forcer le match à arrêter sur une limite de mot (http://www.tcl.tk/man /tcl8.6/TclCmd/re_syntax.htm#M72) –

+0

@DonalFellows Oui, possible. En outre, s'il doit y avoir un espace ou une fin de chaîne, le '\ s +' peut être remplacé par '(?: \ S + | \ Z)', ou même un lookahead comme '(?! \ S)'. [Tout semble fonctionner] (https://ideone.com/JUdATM) pour le scénario actuel. –