Frage Was bedeutet ein führender Stern in erweiterten und einfachen regulären Ausdrücken?


Was ist die Semantik von? * am Anfang eines RE? Es ist dokumentiert (Mann 7 Regex) dass für grundlegende REs es nur passt * (d. h. es wird ein gewöhnliches Zeichen), aber was passiert bei erweiterten REs? An Beispielen sieht es so aus, als hätte es dieselbe Semantik wie ". *", Aber dafür kann ich keine Quelle finden.

prompt> echo "hello" | grep -E  '*'
hello
prompt> echo "hello" | grep  '*'
prompt> 

4
2018-03-06 16:44


Ursprung




Antworten:


So weit wie Der Standard ist besorgt, die Ergebnisse sind nicht definiert:

*+?{

Das <asterisk>, <plus-sign>, <question-mark>, und    <left-brace> muss speziell sein, außer wenn es in einer Halterung verwendet wird   Ausdruck (siehe RE Klammerausdruck). Jede der folgenden Anwendungen   produzieren undefinierte Ergebnisse:

  • Wenn diese Zeichen zuerst in einem ERE oder unmittelbar nach einem <vertical-line>, <circumflex>, oder <left-parenthesis>
  • Wenn ein <left-brace> ist nicht Teil eines gültigen Intervallausdrucks (siehe EREs Übereinstimmende mehrere Zeichen)

Jeder Versuch, konsequent zu erklären, was in diesem Fall passiert, wäre der Umsetzung ausgeliefert. Geht man nach @ kos 'Antwort, stimmen sie wahrscheinlich mit dem leeren regulären Ausdruck überein.


8
2018-03-06 17:43





Beachte das echo "hello" | grep -E '*' kehrt zurück hello weil die Zeichenfolge eine Übereinstimmung ist und grep gibt die ganze Zeile zurück, nicht weil * ist das gleiche wie .*. Sie sollten mit testen -Eo:

% echo "hello" | grep -Eo '*' 
% 

Ich habe keine Quellen, um dies zu sichern, aber eine nicht zu wilde Schätzung basierend auf einem praktischen Test legt nahe, dass eine Sequenz von Quantifizierern am Anfang der Regex einfach ignoriert wird:

% echo "*hello" | grep -Eo '*'    
% echo "+hello" | grep -Eo '+'
% echo "?hello" | grep -Eo '?'
% echo "{1}hello" | grep -Eo '{1}'
1}
% echo "***hello" | grep -Eo '***' 
% echo "*+?{1}hello" | grep -Eo '*+?{1}hello'
1}hello

Meine Eingabeaufforderung setzt den Rückgabewert am Anfang der Zeile voraus, wenn der Rückgabewert ungleich ist 0Das sind also alle Übereinstimmungen.


5
2018-03-06 17:36



Das war auch hilfreich, danke! - VeryHardCoder


Das grep -E 'regex' Zeige Linien, die den passenden Regex enthalten und markiere die Übereinstimmungen in roter Farbe.

unter Berücksichtigung dieser grep -E '*' zeigt alle Zeilen mit null oder mehr '(nichts)' an.

grep '*' wird nur Linien zeigen, die den Stern enthalten.


2
2018-03-06 17:46