Ketika pertanyaan dinyatakan dalam satu contoh, ambiguitas pasti ada. Pertanyaan ini tidak terkecuali.
Untuk contoh yang diberikan dalam pertanyaan, string yang diinginkan jelas:
super example of string key : text I want to keep - end of my string
^^^^^^^^^^^^^^^^^^^
Namun, string ini hanyalah contoh string dan string batas di mana substring tertentu akan diidentifikasi. Saya akan mempertimbangkan string umum dengan string batas umum, yang direpresentasikan sebagai berikut.
abc FF def PP ghi,PP jkl,FF mno PP pqr FF,stu FF vwx,PP yza
^^^^^^^^^^^^ ^^^^^
PP
adalah string sebelumnya , FF
adalah string berikutnya dan topi pesta menunjukkan substring mana yang akan dicocokkan. (Dalam contoh yang diberikan dalam pertanyaan key :
adalah string sebelumnya dan string -
berikut.) Saya berasumsi bahwa PP
dan FF
didahului dan diikuti oleh batas kata (sehingga PPA
dan FF8
tidak cocok).
Asumsi saya, sebagaimana tercermin dari topi pesta, adalah sebagai berikut:
- Substring pertama
PP
mungkin didahului oleh satu (atau lebih) FF
substring, yang jika ada, akan diabaikan;
- Jika
PP
diikuti oleh satu atau lebih PP
s sebelum FF
ditemukan, PP
s berikut adalah bagian dari substring antara string sebelum dan sesudahnya;
- Jika
PP
diikuti oleh satu atau lebih FF
s sebelum a PP
adalah ditemukan, yang pertama FF
berikut PP
dianggap sebagai string berikut.
Perhatikan bahwa banyak jawaban di sini hanya berurusan dengan string dalam bentuk
abc PP def FF ghi
^^^^^
atau
abc PP def FF ghi PP jkl FF mno
^^^^^ ^^^^^
Seseorang dapat menggunakan ekspresi reguler, konstruksi kode, atau kombinasi keduanya untuk mengidentifikasi substring yang diminati. Saya tidak menilai pendekatan mana yang terbaik. Saya hanya akan menyajikan ekspresi reguler berikut yang akan cocok dengan substring yang diminati.
(?<=\bPP\b)(?:(?!\bFF\b).)*(?=\bFF\b)
Nyalakan mesin Anda! 1
Saya menguji ini dengan mesin regex PCRE (PHP), tetapi karena regex sama sekali tidak eksotis, saya yakin ini akan bekerja dengan mesin regex .NET (yang sangat kuat).
Mesin regex melakukan operasi berikut:
(?<= : 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
Teknik ini, mencocokkan satu karakter pada satu waktu, mengikuti string sebelumnya, hingga karakter tersebut F
dan diikuti oleh F
(atau lebih umum lagi, karakter menjadi string yang membentuk string berikut), disebut Solusi Token Keserakahan Tempered .
Secara alami, regex harus dimodifikasi (jika memungkinkan) jika asumsi yang saya tetapkan di atas diubah.
1. Gerakkan kursor di sekitar untuk penjelasan rinci.
substring
danindexof