Vraag Wat is een regex die ALLEEN overeenkomt met een lege string?


Er zijn veel berichten over regexs die overeenkomen met a mogelijk lege string, maar ik kon niet gemakkelijk een set vinden die een regex opleverde enkel en alleen kwam overeen met een lege string.

dat weet ik ^ komt overeen met het begin van elke regel en $ komt overeen met het einde van elke regel en het einde van de reeks. Als zodanig, /^$/ komt overeen met veel meer dan de lege reeks zoals "\ n", "foobar \ n \ n", etc.

Ik had dat echter wel gedacht /\A\Z/ zou overeenkomen met alleen de lege string, sinds \A komt overeen met het begin van de tekenreeks en \Z komt overeen met het einde van de string. Mijn testen laat dat echter zien /\A\Z/ komt ook overeen met "\ n". Waarom is dat?


22
2017-10-01 22:57


oorsprong


antwoorden:


Ik zou een negatieve blik vooruit gebruiken voor elk teken:

^(?![\s\S])

Dit kan alleen overeenkomen als de invoer helemaal leeg is, omdat de tekenklasse overeenkomt met elk teken, inclusief een van de verschillende nieuwe regel karakters.


25
2018-02-21 23:01



Zoals uitgelegd in http://www.regular-expressions.info/anchors.html onder de sectie "Strings eindigen met een regeleinde", \Z zal over het algemeen overeenkomen vóór het einde van de laatste nieuwe regel in reeksen die eindigen op een nieuwe regel. Als u alleen het einde van de reeks wilt matchen, moet u gebruiken \z. De uitzondering op deze regel is Python.

Met andere woorden, om uitsluitend een lege reeks te matchen, moet u gebruiken /\A\z/.


6
2017-10-01 22:57



Het antwoord is mogelijk taalafhankelijk, maar aangezien u er geen vermeldt, is dit wat ik zojuist bedacht heb in 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)

Je zou ook kunnen doen a.match(/^(.{10,}|.{0})$/gm) om lege lijnen of OR-lijnen overeen te komen die aan een criterium voldoen. (Dit is waar ik naar op zoek was om hier te eindigen.)

Ik weet dat ^ overeenkomt met het begin van een regel en $ overeenkomt met het einde van een regel

Dit is alleen het geval als de multiline-vlag is ingeschakeld, anders komt deze alleen overeen met het begin / einde van de tekenreeks. Ik neem aan dat je dit weet en dat impliceert, maar wilde het hier opschrijven voor leerlingen.


3
2018-02-21 22:58



Ik geloof dat Python de enige veel gebruikte taal is die niet ondersteunt \z op deze manier (nog). Er zijn Python-bindingen voor Russ Cox / Google's super snel re2 C ++ -bibliotheek dat kan worden "ingeleverd" als een vervanging voor de gebundelde re.

Hierover is een uitstekende discussie (met tijdelijke oplossingen) Perl Compatible Regular Expression (PCRE) in Python, hier op ZO.

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>

@ tchrist's antwoord is het lezen waard.


3
2018-03-22 17:53



Probeer hier te kijken: https://docs.python.org/2/library/re.html

Ik kwam hetzelfde probleem tegen dat je al had. Ik kon alleen een regex maken die alleen de lege reeks zou evenaren en ook "\ n". Probeer eerst de nieuwe lijntekens in de reeks in te korten / vervangen door een ander teken.

Ik was aan het gebruiken http://pythex.org/ en proberen rare regexes zoals deze:

()

(?:)

^$

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

enzovoort.


2
2017-12-16 20:42



Gebaseerd op het meest goedgekeurde antwoord, is hier nog een andere manier:

var result = !/[\d\D]/.test(string);  //[\d\D] will match any character

0
2018-01-24 17:01