Regex: ile 15'inden sonra tüm karakterleri değiştirmek '...'

oy
2

Ben linux 'sed' ile bazı basit biçimlendirme şeyler yapmak için çalışıyorum ve ben bir '...' ucuna 15 karakterden sonra bir dize kırpmak için bir normal ifade kullanın ve eklemek gerekir. Böyle bir şey:

before: this is a long string that needs to be shortened
after: this is a long ...

herkes i regex olarak bunu yazmak ve mümkünse bu i biraz daha iyi regex bilgi alabilmek için nasıl çalıştığını açıklayabilir nasıl bana göster lütfen?

Oluştur 09/12/2008 saat 22:35
kaynak kullanıcı
Diğer dillerde...                            


5 cevaplar

oy
17

Benim için aşağıdaki çalışır:

echo "This is a test with more than 15 characters" | sed "s/\(.\{15\}\).\+$/\1…/"

Burada yapılan budur herhangi karakteri eşleştirmek olduğunu ( .) 15 kat ( {15}). Biz bu yüzden parantez içinde eşleşen metin yakalamak. Aşağıdaki bölüm ( .+$) satırın sonuna kadar her şey eşleşir. Biz parantez (iç yakalanan her neyse bu yerine \1hiperbolik üç nokta tarafından takip).

Tatmin etmek sed'ın regex lehçesinde (BRE) biz bazı karakterleri kaçmak zorunda.

Cevap 09/12/2008 saat 22:38
kaynak kullanıcı

oy
6

Konrand Rudolph cevap açıklanması, sen açıklamalar talep beri (Ben bu yazdığım gibi ah Konrad de kendi açıklamasını eklendi!)

 sed "s/\(.\{15\}\).+$/\1…/"

\( 

Bir grup başlatmak - Pars içinde ne hatırlamak regexp'in motorunu sormak ve 1 \ türde ilk grup atamak, ikinci Biz sadece burada \ 1 gerekecektir 2 vb \ olarak

.

şey eşleştir ...

\{15\}

... 15 kere.

\)

grubu sona erer. Yani \ 1 ilk 15 karakter içerecek

 .+

Yine bir şey uyuyor. + "Bir veya daha fazla kez" demektir, bu nedenle yukarıda eşleşti 15 karakter ötesinde karakterleri maç olacak, ...

 $

... satırın sonuna kadar

Şimdi biraz değiştirmek için:

\1

\ 1 içeriğiyle değiştirin

...

ve üç nokta.

Bitti!

Cevap 09/12/2008 saat 22:46
kaynak kullanıcı

oy
1

Perl düzenli ifadeler ile:

$ echo 'this is a long string that needs to be shortened' \
| perl -pe 's/^(.{15}).+/$1.../'
this is a long ...

Normal ifadeler hakkında düşünmek en kolay yolu onu eşleşti gereken bir desen dikkate almaktır. Bu durumda kalıp satırın başında başlar:

^

(Not /rasgele bir ayırıcıdır. Diğer karakterler yerine kullanılabilir.) ^Bir düzenli ifade hattı başlangıcını temsil eden bir semboldür olup. Regex Sonraki herhangi bir karakterle eşleşir:

^.

A .herhangi bir karakter için düzenli ifade sembolüdür. Ama biz ilk 15 karakterleri eşleştirmek istiyorum:

^.{15}

Tekrarlanmasını temsil birkaç farklı düzenleyiciler vardır. En yaygın *0 ya da daha fazla anlamına gelir ki. Bir +1 veya daha fazla olduğunu gösterir. {15}Açıkçası tam 15. temsil ( {...}gösterimler daha geneldir Yani. *yazılmış olabilir {0,}ve +aynıdır {1,}.) Şimdi biz onları sonradan kullanmak üzere ilk 15 karakteri yakalamak gerekir:

^(.{15})

Arasındaki her şey (ve )yakalanıp adı verilen özel bir değişkene yerleştirilir $1(ya da bazen \1). Yakalanan ikinci yığın yerleştirilmiş olacağını $2ve böyle devam eder. Son olarak, o kısmı atmak böylece satırın sonuna eşleşmesi gerekir:

^(.{15}).+

Başlangıçta kullanılan *, ancak başka bir kişi olarak muhtemelen dize tam olarak 15 karakter uzunluğunda olduğunda aranıyor değil ne olduğuna işaret:

$ echo 'this is a long ' \
| perl -pe 's/^(.{15}).*/$1.../'
this is a long ...

Bir Kullanarak +16 yoksa desen maç olmayacak demektir inci yerine karakter.

deyimi ikinci yarısı basılmış olur budur:

$1...

$1Daha önce yakalanan değişken kullanılır ve noktalar değişmez olduğu .ikamesi bu tarafında ler. Genellikle, normal ifade değişkenler hariç her şey ikame ifadesinin sağ tarafındaki sabit bulunmaktadır.

Cevap 09/12/2008 saat 22:39
kaynak kullanıcı

oy
0

Eğer gerçekten sadece 15 karakterden sonra her şeyi mastürbasyon istiyor musunuz, yoksa bir 15 karakterlik maksimum uzunluğu empoze etmeye çalışıyorsun? Ne dize 16 karakter uzunluğunda olur? Şimdiye kadar sunulan çözümlerden tüm tek fazlalık karakter ile değiştirmek için bu kesmek olacaktır üç nokta. (Ben Konrad ve Paul üç nokta karakteri kullanılır biliyorum ama OP örnekte üç noktayı kullanılan;. Biz bu konuda bir karar almalısınız)

Eğer 15 maksimum uzunluğuna dizeleri kırpmak isterseniz üç nokta da dahil olmak üzere , bunu yapabilirsiniz:

s/^\(.\{12\}\).\{3\}.\+$/\1.../

15'ten fazla karakter varsa Hala sadece maçları, ama sonra nokta yer açmak için 12 karakterden sonra her şeyi kapalı doğruyor.

Cevap 10/12/2008 saat 05:06
kaynak kullanıcı

oy
0

Perl, sen yazabilirsiniz s/(.{15}).*/$1.../. Ben sed {15} notasyonu kullanabilirsiniz emin değilim ama değilse, s/\(...............\).*/\1.../(gruptaki 15 noktalı).

Kaçmanıza gerekip gerekmediğini hatırlamak asla (sed gruplama yaparken. Sadece bunu denedim ve ihtiyaç yoktur \(ve\)

Cevap 09/12/2008 saat 22:42
kaynak kullanıcı

Cookies help us deliver our services. By using our services, you agree to our use of cookies. Learn more