Qu'est-ce qu'une expression rationnelle pour ne correspondre qu'à une chaîne vide?

Il y a beaucoup de messages sur les expressions rationnelles pour correspondre à une potentiellement chaîne vide, mais je ne pouvais pas facilement en trouver qui fournissait une expression rationnelle qui seulement correspondait à une chaîne vide.

Je sais que ^ qui correspondent au début d'une ligne et $ correspondra à la fin de chaque ligne ainsi que la fin de la chaîne. En tant que tel, /^$/ correspond bien plus que la chaîne vide telle que "n", "foobarnn", etc.

J'aurais pensé, cependant, que /AZ/ correspondrait juste au chaîne vide, puisque A correspond au début de la chaîne et Z correspond à la fin de la chaîne. Cependant, mes tests montrent que /AZ/ correspondra également à "n". Pourquoi est-ce?

23
demandé sur dreftymac 2013-10-02 02:57:03

7 réponses

J'utiliserais un regard négatif pour n'importe quel char:

^(?![\s\S])

Cela ne peut correspondre que si l'entrée est totalement vide, car la classe de caractères correspondra à n'importe quel caractère, y compris l'un des différents caractères de saut de ligne.

26
répondu Bohemian 2016-07-29 21:18:02

Comme expliqué dans http://www.regular-expressions.info/anchors.html sous la section "chaînes se terminant par un saut de ligne", \Z correspond généralement avant la fin du dernier saut de ligne dans les chaînes se terminant par un saut de ligne. Si vous voulez seulement correspondre à la fin de la chaîne, vous devez utiliser \z. L'exception à cette règle est le Python.

En d'autres termes, exclusivement pour correspondre à une chaîne vide, vous devez utiliser /\A\z/.

7
répondu Peter Alfvin 2013-10-01 22:57:03

La réponse peut dépendre de la langue, mais puisque vous n'en mentionnez pas, voici ce que je viens de trouver dans js:

 var a = ['1','','2','','3'].join('\n');

 console.log(a.match(/^.{0}$/gm)); // ["", ""]

 // the "." is for readability. it doesn't really matter
 a.match(/^[you can put whatever the hell you want and this will also work just the same]{0}$/gm)

Vous pouvez également faire a.match(/^(.{10,}|.{0})$/gm) pour faire correspondre les lignes vides ou les lignes qui répondent à un critère. (C'est ce que je cherchais pour finir ici.)

Je sais que ^ va correspondre au début d'une ligne et $ correspondra à la fin de chaque ligne

Cela n'est vrai que si vous avez l'indicateur multiligne activé, sinon il ne correspondra qu'au début / à la fin de chaîne. Je suppose que vous le savez et que vous l'insinuez, mais je voulais le noter ici pour les apprenants.

3
répondu Cory Mawhorter 2015-02-21 22:58:51

Je crois que Python est le seul langage largement utilisé qui ne supporte pas \z de cette façon (encore). Il y a liaisons Python pour Russ Cox / bibliothèque C++ super rapide re2 de Google {[6] } qui peut être "déposé" en remplacement de la re fournie.

Il y a une excellente discussion (avec des solutions de contournement) pour cela à Perl Expression régulière Compatible (PCRE) en Python , ici sur SO.

python
Python 2.7.11 (default, Jan 16 2016, 01:14:05) 
[GCC 4.2.1 Compatible FreeBSD Clang 3.4.1 on freebsd10
Type "help", "copyright", "credits" or "license" for more information.
>>> import re2 as re
>>> 
>>> re.match(r'\A\z', "")
<re2.Match object at 0x805d97170>

@la réponse de tchrist vaut la lecture.

3
répondu G. Cito 2017-05-23 12:34:43

Essayez de regarder ici: https://docs.python.org/2/library/re.html

Je suis tombé sur le même problème que vous aviez cependant. Je ne pouvais que construire une expression rationnelle qui ne correspondrait qu'à la chaîne vide et aussi "\n". Essayez d'abord de rogner/remplacer les caractères de nouvelle ligne dans la chaîne par un autre caractère.

J'utilisais http://pythex.org/ et essayer des expressions rationnelles bizarres comme celles-ci:

()

(?:)

^$

^(?:^\n){0}$

Et ainsi de suite.

2
répondu mbomb007 2014-12-16 20:42:44

Wow, vous y penserez trop. C'est aussi simple que ce qui suit. En outre, beaucoup de ces réponses ne sont pas comprises par le dialecte RE2 utilisé par C et golang.

^$
1
répondu Jam Risser 2018-09-11 01:19:59

Basé sur la réponse la plus approuvée, voici encore une autre façon:

var result = !/[\d\D]/.test(string);  //[\d\D] will match any character
0
répondu JohnP2 2017-02-14 15:15:06