Nedir \? düzenli ifadede ne demek?


16

7 haneli telefon numarasını aramak için aşağıdaki komut kullanılır:

grep "[[:digit:]]\{3\}[ -]\?[[:digit:]]\{4\}" file

Ne anlama geliyor \??

Yanıtlar:


21

Sanki ?diğer birçok normal ifade motorlarında ve araçlar "sıfır maç ya da her türlü biri kendinden önce gelen".

Örneğinizde, öğesine \?uygulanır [ -], yani bir boşluk veya eksi ile eşleşmeye çalışır, ancak boşluk veya eksi isteğe bağlıdır.

Yani bunlardan herhangi biri eşleşecek:

555 1234
555-1234
5551234

Bunun \?yerine yazılmasının nedeni ?geriye dönük uyumluluk içindir.

Orijinal sürümünde, sadece grepbasit ?bir soru işareti anlamına gelen "temel normal ifade" adı verilen farklı bir normal ifade türü kullanılmıştır .

GNU grep'in sıfır veya bir işlevselliğe sahip olabilmesi için eklediler, ancak \?kullanılan komut dosyalarının ?beklendiği gibi çalışabilmesi için sözdizimini kullanmak zorunda kaldılar .

Grep'in -E"yaygın düzenli ifadeler" olarak adlandırılan daha yaygın olan normal ifade türünü kullanmasını sağlayan bir seçeneği olduğunu unutmayın .

man 1 grep:

   -E, --extended-regexp
          Interpret PATTERN as an extended regular expression
          (ERE, see below).  (-E is specified by POSIX.)

   -G, --basic-regexp
          Interpret PATTERN as a basic regular expression (BRE, see below).
          This is the default.

...

Repetition
    A regular expression may be followed by one of several repetition operators:
    ?      The preceding item is optional and matched at most once.

...

    grep understands three different versions of regular expression syntax:
    “basic,” “extended” and “perl.”

...

Basic vs Extended Regular Expressions
    In basic regular expressions the meta-characters ?, +, {, |, (, and )
    lose their special meaning; instead use the backslashed versions
    \?, \+, \{, \|, \(, and \).

Daha fazla bilgi:


egrepKomut eşdeğerdir grep -E. GNU grep dışındaki sürümler için grep, -Eseçeneği kabul edebilir veya etmeyebilir ve egrepayrı bir program olabilir.
Keith Thompson

@ KeithThompson, grep -Eresmi POSIX yoludur. egrepsusv2 (1997) 'de kullanımdan kaldırılmış ve susv3 (2001)' de POSIX ve Unix spesifikasyonlarından çıkarılmıştır.
Stéphane Chazelas

1
\?gerçi bir GNUizm.
Stéphane Chazelas

8

Ne yazık ki, düzenli ifadelerin tam sözdizimi farklı programlar arasında biraz değişir: grep regexes, C ++ regexes ile tam olarak aynı olmayan Em regexes ile tam olarak aynı olmayan sed regexes ile tam olarak aynı değildir. üzerinde. Daha da kötüsü, grep gibi "standart" bir araç bile farklı Unix benzeri işletim sistemleri arasında biraz farklılık gösterebilir.

Bir normal ifadede, bazı karakterlerin özel bir anlamı vardır (örneğinizdeki köşeli parantezler gibi) ve önüne "ters eğik çizgi koyarak" kaçtığınız zaman "normal karakterler olarak normal anlamlarına geri dönün (böylece bir tam parantez \ [) olarak yazılmıştır. Diğerleri ise tam tersi şekilde çalışırlar ve yalnızca kaçtıklarında özel bir anlam kazanırlar (örneğin, düz n yalnızca bir harftir, \ n bir satır beslemesidir). Ve bunlar yine, normal ifade uygulamaları arasında değişebilir.

Çoğu normal ifade uygulamasında, bir soru işareti önceki öğenin isteğe bağlı olduğu anlamına gelirken, bir çıkış işareti soru işareti (\?) Değişmez bir soru işaretidir. Ama birkaç lehçede, bu tam tersi. Örneğiniz her iki şekilde de mantıklı olabilir, ancak lehçelerden birine sahip olduğunuzdan şüpheleniyorum? değişmez ve \? isteğe bağlı semboldür. Yani normal ifadeniz muhtemelen "üç basamaklı, isteğe bağlı olarak bir boşluk veya kısa çizgi ve ardından dört basamaklı" anlamına gelir.

(\ {3 \} gibi yapılarda "önceki öğenin tam olarak 3'ü" anlamına gelen açık bir ipucu daha görülebilir. Çoğu normal lehçede bu {3} yazılır ve \ {gerçek bir ayraç olur .)


6

Bu, diğer yanıtlarda zaten yer alan bilgilerin hızlı bir özetidir.

İçinde grep, ?değişmez bir soru işareti karakteriyle eşleşir ve \?kendisinden önce gelenlerin sıfır ya da bir tekrarını belirtir. Dolayısıyla, sorunuzdaki örnekte [ -]\?bir boşlukla veya bir tire işareti ile ya da hiçbir şeyle eşleşmez.

Gelen egrepveya grep -Ebu tersi; \?değişmez bir soru işaretiyle eşleşir ve ?sıfır veya bir tekrar olduğunu belirtir.

Bu GNU grep için geçerlidir; GNU olmayan grep uygulamaları için ayrıntılar biraz farklılık gösterebilir. Özellikle, grepve egreptarihsel olarak iki ayrı program grepvardı ve sanırım yaşlıların-E seçeneği. POSIX belirtiyor grep -E, ancak (keşfettiğim için şaşırdım) bahsetmiyor egrep.

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.