Yanıtlar:
Ne yazık ki, tarihsel nedenlerden dolayı, farklı araçlar biraz farklı düzenli ifade sözdizimine sahiptir ve bazen bazı uygulamaların diğer araçlar tarafından desteklenmeyen uzantıları vardır. Ortak bir zemin olsa da, her araç yazarının farklı seçimler yapmış gibi görünüyor.
Sonuç olarak, bir araçta çalışan düzenli bir ifadeniz varsa, başka bir araçta çalışmak için değiştirmeniz gerekebilir. Yaygın araçlar arasındaki ana farklar:
+?|(){}
ters eğik çizgi gerektirip gerektirmediği;.[]*^$
ve genellikle+?|()
Bu cevapta ana standartları listeliyorum . Ayrıntılar için kullandığınız araçların belgelerine bakın.
Wikipedia'nın düzenli ifade motorlarını karşılaştırması, genel uygulamaların desteklediği özellikleri listeleyen bir tabloya sahiptir.
Temel düzenli ifadeler POSIX standardı tarafından kodlanmıştır . Bu tarafından kullanılan sözdizimi grep
, sed
ve vi
. Bu sözdizimi aşağıdaki özellikleri sunar:
^
ve $
sadece bir satırın başında ve sonunda eşleştirin..
herhangi bir karakterle (veya yeni satır hariç herhangi bir karakterle) eşleşir.[…]
parantez içinde listelenen herhangi bir karakterle eşleşir (karakter takımı). Açma braketinden sonraki ilk karakter a ise ^
, listelenmeyen karakterler yerine eşleştirilir. A eklemek için ]
, açılıştan hemen sonra [
(veya [^
negatif bir küme ise) koyun. Eğer -
iki karakter arasında, bir dizi anlamına gelir; değişmezi dahil etmek için -
, bir aralık olarak ayrıştırılamadığı bir yere koyun.^$.*\[
Bir sonraki karakterdeki herhangi bir alıntıdan önce ters eğik çizgi .*
önceki karakter veya alt ifade 0, 1 veya daha fazla kez eşleşir.\(…\)
*
Operatör veya geri referanslar ve \DIGIT
değiştirmeler ile birlikte kullanmak için sözdizimsel bir gruptur .\1
,, \2
… karşılık gelen grupla eşleşen tam metni eşleştirir, örneğin \(fo*\)\(ba*\)\1
eşleşir foobaafoo
ancak eşleşmez foobaafo
. 10. gruba ve ötesine atıfta bulunmanın standart bir yolu yoktur ( \10
bunun ilk anlamı standart olan a'yı izler 0
).Aşağıdaki özellikler de standart ancak bazı kısıtlı uygulamalardan eksik:
\{m,n\}
önceki karakteri veya alt ifadeyi m ila n kere arasında eşleştirir ; n veya m ihmal edilebilir ve tam olarak m anlamına gelir .\{m\}
[[:alpha:]]
herhangi bir harfle eşleşir. Parantez ifadelerinin modern uygulamaları ) aynı zamanda benzer harmanlama elemanlarını[.ll.]
ve benzerlik sınıflarını içerir [=a=]
.Aşağıdakiler yaygın uzantılardır (özellikle GNU araçlarında), ancak tüm uygulamalarda bulunmazlar. Kullanmakta olduğunuz aletin kılavuzuna bakın.
\|
değişim için: veya ile foo\|bar
eşleşir .foo
bar
\?
(kısa için \{0,1\}
) ve \+
(kısa için \{1,\}
), bir önceki karaktere veya alt ifadeye en çok 1 veya en az 1 kez eşleşir.\n
yeni bir satırla \t
eşleşir, bir sekmeyle eşleşir vb.\w
Herhangi bir kelime bileşeniyle eşleşir ( [_[:alnum:]]
yerelleştirme söz konusu olduğunda kısa ama bununla birlikte değişkenlik gösterir) ve \W
bir kelime bileşeni olmayan herhangi bir karakterle eşleşir.\<
ve \>
boş dizgiyi sırasıyla kelimenin başında veya sonunda eşleştirin; \b
ikisiyle de eşleşir ve \B
eşleşmeyenlerle eşleşir \b
.\|
Operatörsüz araçların normal ifadelerin tam gücüne sahip olmadığını unutmayın. Geri referanslar, matematiksel anlamda düzenli ifadelerle yapılamayan bazı ekstra şeylere izin verir.
Genişletilmiş düzenli ifadeler POSIX standardı tarafından kodlanmıştır . BRE'ye göre en büyük avantajları düzenliliktir: tüm standart operatörler noktalama karakterleridir, noktalama karakterlerinden her zaman alıntı yapmadan önce bir ters eğik çizgi vardır. Bu tarafından kullanılan sözdizimi awk
, grep -E
ya egrep
, GNU sed -r
ve bash en=~
operatörü. Bu sözdizimi aşağıdaki özellikleri sunar:
^
ve $
sadece bir satırın başında ve sonunda eşleştirin..
herhangi bir karakterle (veya yeni satır hariç herhangi bir karakterle) eşleşir.[…]
parantez içinde listelenen herhangi bir karakterle eşleşir (karakter takımı). İlk ^
ve aralıklarla yapılan tamamlama , BRE'deki gibi çalışır (yukarıya bakın). Karakter sınıfları kullanılabilir, ancak birkaç uygulamada eksik. Modern uygulamalar aynı zamanda denklik sınıflarını ve harmanlama öğelerini de destekler. Köşeli parantez içindeki ters eğik çizgi bir sonraki karakteri bazı uygulamalarda, ancak tüm uygulamalarda kullanır; kullanmak \\
taşınabilirlik için bir ters eğik çizgi anlamına.(…)
bu, kullanım için *
veya \DIGIT
değiştirmelerde kullanılmak üzere, sözdizimsel bir gruptur .|
değişim için: veya ile foo|bar
eşleşir .foo
bar
*
, +
Ve ?
bir önceki karakter eşleşen veya bir kaç kez alt ifade: 0 ya da daha fazla *
, 1 ya da daha fazla +
, 0 veya 1 için ?
.{m,n}
önceki karakteri veya alt ifadeyi m ve n zamanları arasında eşleştirir (bazı uygulamalarda yoktur); n veya m ihmal edilebilir ve tam olarak m anlamına gelir .{m}
\DIGIT
$0 ~ "(...)\\1"
\n
\t
\b
\B
\b
\B
PCRE, başlangıçta Perl tarafından tanıtılan ve GNU tarafından kabul edilen grep -P
ve çoğu PCRE kütüphanesi aracılığıyla birçok modern araç ve programlama dili olan ERE'nin uzantılarıdır . Örneklerle güzel biçimlendirme için Perl belgelerine bakın . En son Perl sürümünün tüm özellikleri PCRE tarafından desteklenmez (örn. Perl kod çalıştırma yalnızca Perl'de desteklenir). Desteklenen özelliklerin bir özeti için PCRE kılavuzuna bakın . ERE'ye yapılan başlıca eklemeler:
(?:…)
ele geçirmeyen bir gruptur: geri (…)
referanslar için olduğu gibi , ancak sayılmaz.(?=FOO)BAR
(lookahead) eşleşir BAR
, ancak yalnızca FOO
aynı pozisyondan başlamak için bir eşleşme varsa . Bu, bir eşleşmeyi aşağıdaki metni dahil etmeden tutturmak için kullanışlıdır: foo(?=bar)
eşleşmeler foo
ancak yalnızca takip ettiği takdirde bar
.(?!FOO)BAR
(negatif bakış açısı) eşleşir BAR
, ancak FOO
aynı konumda bir eşleşme de yoktur . Örneğin (?!foo)[a-z]+
, başlamayan herhangi bir küçük kelimeyle eşleşir foo
; [a-z]+(?![0-9)
Bir sayı gelmez herhangi küçük bir sözcükle eşleşen (şimdiye içinde foo123
, bu maçları fo
değil foo
).(?<=FOO)BAR
(lookbehind) eşleşir BAR
, ancak hemen için bir eşleşme öncesinde geldiyse FOO
. FOO
Bilinen bir uzunluğa sahip olması gerekir (gibi tekrarlama operatörlerini kullanamazsınız *
). Bu, eşleşmeye önceki metni dahil etmeden eşleştirmeyi bağlamak için yararlıdır: (?<=^| )foo
eşleşir foo
ancak önce bir boşluk veya dizgenin başından önce geldiyse eşleşir .(?<!FOO)BAR
(negatif gözbebeği) eşleşir BAR
, ancak hemen eşleşmesinden önce gelmemişse FOO
. FOO
Bilinen bir uzunluğa sahip olması gerekir (gibi tekrarlama operatörlerini kullanamazsınız *
). Bu, eşleşmeye önceki metni dahil etmeden eşleştirmeyi bağlamak için yararlıdır: (?<![a-z])foo
eşleşir, foo
ancak yalnızca küçük harfle yazılmamışsa eşleşir .Emacs'in sözdizimi BRE ve ERE arasında orta düzeydedir. Emac’lara ek olarak -regex
GNU find’in varsayılan sözdizimidir . Emacs aşağıdaki operatörleri sunar:
^
, $
, .
, […]
, *
, +
, ?
ERE olarak\(…\)
, \|
, \{…\}
, BRE olarak\DIGIT
\<
ve \>
kelime sınırları için; ve Emacs'ın son sürümlerinde, genellikle Emacs benzeri bir sözdizimine sahip diğer motorlarda desteklenmez.Shell globs (joker karakterler) normal ifadelerden tamamen farklı ve daha az güçlü olan bir sözdizimi ile desen eşleştirmesi gerçekleştirir. Kabuklara ek olarak, bu joker karakterler find -name
rsync filtreleri gibi diğer araçlarla da kullanılabilir . POSIX desenleri aşağıdaki özellikleri içerir:
?
herhangi bir tek karakterle eşleşir.[…]
normal düzenli ifade sözdizimlerinde olduğu gibi ayarlanmış bir karakterdir. Bazı kabuklar karakter sınıflarını desteklemez. Bazı mermiler seti olumsuzlamak !
yerine gerektirir ^
.*
herhangi bir karakter dizisi ile eşleşen (genellikle haricinde /
dosya yollarını eşleşen ne olursa /
dışlanan *
sonra, **
bazen içerir /
, ancak aracın belgelerine bakın).Ksh, normal ifadelerin tam gücüyle eşleşen desenini veren ek özellikler sunar . Bu özellikler çalıştırdıktan sonra bash olarak da mevcuttur shopt -s extglob
. Zsh farklı bir sözdizimine sahiptir, ancak daha sonra ksh'ın sözdizimini de destekleyebilir setopt ksh_glob
.
grep
, tw
, expr
...). Bunun dışında ksh
, bu araç seti nadiren AT&T dışında bulunur.
regex(7)
sizinle aynı fikirde ve [these]
"parantez ifadeleri" ve ("parantez ifadeleri" içinde) [:these:]
"karakter sınıfları " adını veriyor . Bununla nasıl başa çıkacağımı bilemiyorum.
-
aralığını belirten ve ya (opsiyonel sonra ilk kaçmış edilmelidir ^
tam anlamıyla alınacak ise) ya da son. (Ben mesela kaynaklanan hataların bol gördüğümüz [A-z]
kodları 122 65 ve yanlışlıkla ait karakterleri ile eşleşen vakadan- içinde -NOT değişim, her içerir: [\]^_`
. Ben de geçerli hala karışık gördüğüm [!-~]
ANSI yazdırılabilir tüm karakterleri eşleştirmek için [\x21-\x7e]
Farklı bir boyutta kafa karıştırsa da, eyleminde en azından basit olanı olarak görmeyi tercih ediyorum .)
vim
RE'ler , 's' ve '' AT '' ve '' libast '' lardırksh93
.