Şu düzenli ifadeyi ele alalım: /^[^abc]/
. Bu, a, b veya c hariç, bir dizenin başındaki herhangi bir tek karakterle eşleşecektir.
Bundan sonra bir *
eklerseniz - /^[^abc]*/
- düzenli ifade, bir a
, veya b
, veya c
ile karşılaşana kadar sonraki her karakteri sonuca eklemeye devam eder.
Örneğin, "qwerty qwerty whatever abc hello"
kaynak dizesiyle, ifade "qwerty qwerty wh"
ile eşleşecektir.
Ancak eşleşen dizenin "qwerty qwerty whatever "
olmasını isteseydim ne olurdu?
...Başka bir deyişle, tam dizi "abc"
ye kadar (ancak dahil değil) her şeyi nasıl eşleştirebilirim?
Eğer "abc"'ye kadar her şeyi yakalamak istiyorsanız:
/^(.*?)abc/
Açıklama:
( )parantez içindeki ifadeyi
$1,
$2`, vb. kullanarak erişim için yakalar.
^
satır başlangıcıyla eşleşir
.*herhangi bir şeyle eşleşir,
?` ayrıcalıklı değildir (gerekli minimum karakter sayısıyla eşleşir) - [1]
[1] Buna ihtiyaç duyulmasının nedeni, aksi takdirde aşağıdaki dizede:
whatever whatever something abc something abc
varsayılan olarak, regex'ler greedy'dir, yani mümkün olduğunca çok eşleşecektir. Bu nedenle /^.*abc/
"whatever whatever something abc something " ile eşleşecektir. Sıkıcı olmayan niceleyici ?
eklendiğinde regex yalnızca "whatever whatever something " ile eşleşir.
Sanırım alt ifadelere ihtiyacınız var. Eğer doğru hatırlıyorsam, alt ifadeler için normal ()
parantezlerini kullanabilirsiniz.
Bu kısım grep kılavuzundan:
Back References and Subexpressions
The back-reference \n, where n is a single digit, matches the substring
previously matched by the nth parenthesized subexpression of the
regular expression.
^[^(abc)]` gibi bir şey yapmak işinizi görecektir.
$bir dizenin sonunu işaret eder, bu nedenle bunun gibi bir şey çalışmalıdır:
[[^abc]*]$burada
abc`nin herhangi bir yinelemesinde SONU OLMAYAN herhangi bir şey arıyorsunuz, ancak bunun sonda olması gerekir
Ayrıca, regex içeren bir betik dili kullanıyorsanız (php veya js gibi), bir kalıpla ilk karşılaştığında duran bir arama işlevine sahiptirler (ve soldan veya sağdan başlamayı belirtebilirsiniz veya php ile dizeyi yansıtmak için bir implode yapabilirsiniz).