'Arasındaki fark. , '?' ve düzenli ifadelerde '*'?


21

Bu üç unsurun (bunlara metachatorlar denir mi?) Ne kadar farklı olduğuna dair bir örnek alabilir miyim?

Bunun *her şey ya da hiçbir şey anlamına geldiğini biliyorum , ama düşünmenin doğru yolu olup olmadığından emin değilim. Öte yandan .ve ?aynı görünüyor. Bir karakterle eşleşiyorlar, değil mi?



@Cyrus veya daha iyisi: StackOverflow Regex Belgeleri .
Thomas Ayoub

Yanıtlar:


16

Doğrudan Vikipedi alınan :

? Soru işareti, önceki öğenin sıfır veya bir oluşumunu gösterir. Örneğin, colouri® hem "color" hem de "color" ile eşleşir.

*Yıldız işareti, bir önceki öğenin sıfır veya daha fazla oluşumunu gösterir. Örneğin, ab * c "ac", "abc", "abbc", "abbbc" vb. İle eşleşir.

En büyük fark, yıldız işaretinin sıfır veya daha fazla oluşumla eşleşmesi, soru işaretinin sıfır veya bir olay ile eşleşmesidir . Bu iki örneği karşılaştırın:

$ printf "colour\ncolor\ncolouur\n" | egrep 'colou?r'                          
colour
color
$ printf "colour\ncolor\ncolouur\n" | egrep 'colou*r'                          
colour
color
colouur

İçinde Çünkü colouurmektupta u (eleme önce önceki eleman ?) bir kereden fazla oluştu o ile eşleşti değil ?ama birlikte eşleştirilir*

Benzer bir örnek:

$ printf "error\neror\ner\n" | egrep 'er?or'                                   
eror
$ printf "error\neror\ner\n" | egrep 'er*or'                                   
error
eror

Aynı wikipedia sayfasından:

Herhangi bir tek karakterle eşleşir (birçok uygulama yeni satırları dışlar ve tam olarak hangi karakterlerin yeni satırlar olduğunu düşünür, lezzet, karakter kodlaması ve platforma özgüdür, ancak satır besleme karakterinin dahil olduğunu varsaymak güvenlidir). POSIX parantez ifadelerinde, nokta karakteri değişmez bir noktayla eşleşir. Örneğin, ac "abc" vb. İle eşleşir, ancak [ac] sadece "a", "." Veya "c" ile eşleşir.

Örneğimizde

$ printf "colour\ncolor\ncolouur\n" | egrep 'colo.r'                           
colour
$ printf "colour\ncolor\ncolouur\n" | egrep 'colou.r'                          
colouur

Yeterince uygun, sonuncusu olarak okur match any line that has "colou", plus any character, plus letter "r"

Sonuç

Siz sordunuz: “'' '' Hepsi ya da hiç anlamına gelir, ama bunu düşünmenin doğru yolunun olup olmadığından emin değilim. Öte yandan '.” & '?' aynı gözüküyor. " Gördüğünüz gibi, nokta ve yıldız tam olarak aynı değil. Nokta, önceki eleman üzerinde soru işareti devam ederken, belirli bir pozisyonu işgal edebilecek herhangi bir karakter üzerinde çalışır.


32

Normal ifadeleri kabuk küreği ile karıştırıyor olabilirsiniz

Düzenli ifadede sözdizimi .herhangi bir tek karakteri temsil eder (genellikle yeni satır karakteri hariç), önceki regex atomunun sıfırı veya daha fazlasını ifade *eden bir niceleyicidir (karakter veya grup). ?sıfır veya bir önceki atomun bir örneğini, veya (onu destekleyen regex varyantlarında) niceleyici davranışını açgözlü olmayana ayarlayan bir değiştirici anlamına gelen bir niceleyicidir.

Kabuk kürelerde, sıfır veya daha fazla karakter dizisini (regex eşdeğeri ) temsil ederken ?, tek bir karakteri ( regex'inki gibi .) *temsil eder .*.

Yararlı bulabileceğiniz birkaç referans http://www.regular-expressions.info/quickstart.html ve http://mywiki.wooledge.org/glob adresindedir.


6

Not: Examples provided are in Python.Yine de konsept aynı kalır.

'.'Bir olan eşleştirme sembolü dışında herhangi bir karakterle eşleşir satır karakteri (bu da birlikte geçersiz kılınabilir re.DOTALLPython argüman). Bu nedenle aynı zamanda Joker olarak da adlandırılır .

'*'bir niceleyicidir (bir elementin ne sıklıkla meydana gelebileceğini tanımlar). {0,} için kısa .

“Sıfır veya daha fazla eşleş anlamına gelir - yıldızdan önce gelen grup, metinde herhangi bir sayıda olabilir. Tamamen eksik olabilir veya tekrar tekrar tekrarlanabilir.

'?'aynı zamanda bir niceleyicidir . {0,1} için kısa .

"Sıfır eşleşmesi veya bu soru işaretinden önceki gruptan biri" anlamına gelir . Ayrıca , soru işaretinden önceki bölümün isteğe bağlı olması nedeniyle yorumlanabilir .

Örneğin:

pattern = re.compile(r'(\d{2}-)?\d{10}')
mobile1 = pattern.search('My number is 91-9999988888')
mobile1.group()
Output: '91-9999988888'

mobile2 = pattern.search('My number is 9999988888')
mobile2.group()
Output: '9999988888'

Yukarıdaki örnekte '?' ondan önceki iki basamağın isteğe bağlı olduğunu gösterir.

'Arasındaki fark. ve '?':

'.'normal ifadede tuttuğu yer için herhangi bir tek karakteri eşleştirir / kabul eder / doğrular .

Örneğin:

pattern = re.compile(r'.ot')
pattern.findall('dot will identify both hot and got.')
Output: ['dot', 'hot', 'got']

'?'ondan önceki grubun sıfır veya tek oluşumunu eşleştirir / doğrular .

Cep telefonu numarası örneğini kontrol edin.

Aynı şey ile gider '*'. Ondan önceki gruptaki sıfır ya da daha fazla oluşum kontrol eder .

Kombinasyon:

'.*': Mümkün olduğu kadar çok dizi kabul eder. Açgözlü yaklaşım .

'.*?'İlk eşleşen diziyi kabul eder ve durur. Açgözlü olmayan yaklaşım

Daha fazla bilgi için, aşağıdaki iki soruyu okumayı düşünün ...

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.