Sorular tek bir örnek üzerinden ifade edildiğinde kaçınılmaz olarak belirsizlikler vardır. Bu soru bir istisna değildir.
Soruda verilen örnek için istenen dizi açıktır:
super example of string key : text I want to keep - end of my string
^^^^^^^^^^^^^^^^^^^
Bununla birlikte, bu dize, belirli alt dizelerin tanımlanacağı dizelerin ve sınır dizelerinin bir örneğidir. Aşağıda gösterildiği gibi, genel sınır dizeleri olan genel bir dizeyi ele alacağım.
abc FF def PP ghi,PP jkl,FF mno PP pqr FF,stu FF vwx,PP yza
^^^^^^^^^^^^ ^^^^^
PPolduğu önceki dize , FFaşağıdaki dize ve parti şapkaları altdizgelerin eşleştirilecek olan göstermektedir. (Söz konusu Verilen örnekte key : önceki dizedir ve -aşağıdaki dizedir.) Bunu varsaydım PPve FFöncesinde ve (böylece sözcük sınırları tarafından takip edilmektedir PPAve FF8denk gelmiyor).
Parti şapkalarının yansıttığı şekliyle varsayımlarım şu şekildedir:
- Birinci alt dizeden
PPönce FF, varsa, dikkate alınmayan bir (veya daha fazla) alt dizi gelebilir ;
- Eğer
PPbir kişi tarafından takip ya da daha fazla olan PPdaha önce s FFkarşılaşıldığında, aşağıdaki PPs, ön ve son dizileri arasındaki substring bir parçasıdır;
- Bir karşılaşmadan önce bir
PPveya daha fazla FFs PPizliyorsa, ilk FFtakip PPeden aşağıdaki dize olarak kabul edilir.
Buradaki yanıtların çoğunun yalnızca formun dizeleriyle ilgili olduğuna dikkat edin
abc PP def FF ghi
^^^^^
veya
abc PP def FF ghi PP jkl FF mno
^^^^^ ^^^^^
İlgili alt dizeleri tanımlamak için bir normal ifade, kod yapıları veya ikisinin bir kombinasyonu kullanılabilir. Hangi yaklaşımın en iyi olduğu konusunda hiçbir yargıya varmıyorum. Sadece ilgilenilen alt dizelerle eşleşen aşağıdaki normal ifadeyi sunacağım.
(?<=\bPP\b)(?:(?!\bFF\b).)*(?=\bFF\b)
Motorunuzu çalıştırın! 1
Bunu PCRE (PHP) regex motoruyla test ettim, ancak regex hiç de egzotik olmadığından, .NET regex motoruyla (ki bu çok sağlam) çalışacağından eminim.
Normal ifade motoru aşağıdaki işlemleri gerçekleştirir:
(?<= : begin a positive lookbehind
\bPP\b : match 'PP'
) : end positive lookbehind
(?: : begin a non-capture group
(?! : begin a negative lookahead
\bFF\b : match 'FF'
) : end negative lookahead
. : match any character
) : end non-capture group
* : execute non-capture group 0+ times
(?= : begin positive lookahead
\bFF\b : match 'FF'
) : end positive lookahead
Karakter gelene Fve onu takip edene kadar F(veya daha genel olarak karakter, aşağıdaki dizeyi oluşturan dizeyi oluşturur), her seferinde bir karakteri eşleştirme tekniğine Tempered Greedy Token Solution denir .
Doğal olarak, yukarıda belirttiğim varsayımlar değiştirilirse normal ifadenin (mümkünse) değiştirilmesi gerekir.
1. Ayrıntılı açıklamalar için imleci hareket ettirin.
substringveindexof