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
^^^^^^^^^^^^ ^^^^^
PPadalah string sebelumnya , FFadalah 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 PPdan FFdidahului dan diikuti oleh batas kata (sehingga PPAdan FF8tidak cocok).
Asumsi saya, sebagaimana tercermin dari topi pesta, adalah sebagai berikut:
- Substring pertama
PPmungkin didahului oleh satu (atau lebih) FFsubstring, yang jika ada, akan diabaikan;
- Jika
PPdiikuti oleh satu atau lebih PPs sebelum FFditemukan, PPs berikut adalah bagian dari substring antara string sebelum dan sesudahnya;
- Jika
PPdiikuti oleh satu atau lebih FFs sebelum a PPadalah ditemukan, yang pertama FFberikut PPdianggap 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 Fdan 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.
substringdanindexof