Mirip dengan pertanyaan yang diposting di sini , saya mencari solusi di Java.
Artinya, bagaimana menemukan indeks kemunculan n dari sebuah karakter / string dari sebuah string?
Contoh: " / folder1 / folder2 / folder3 / ". Dalam kasus ini, jika saya meminta kemunculan ketiga garis miring (/), itu muncul sebelum folder3, dan saya berharap untuk mengembalikan posisi indeks ini. Niat sebenarnya saya adalah untuk mensubstringinya dari kemunculan n karakter.
Apakah ada metode nyaman / siap pakai yang tersedia di Java API atau apakah kita perlu menulis logika kecil sendiri untuk menyelesaikan ini?
Juga,
- Saya dengan cepat mencari apakah ada metode yang didukung untuk tujuan ini di StringUtils Apache Commons Lang , tetapi saya tidak menemukannya.
- Dapatkah ekspresi reguler membantu dalam hal ini?
Jawaban:
Jika proyek Anda sudah bergantung pada Apache Commons, Anda dapat menggunakan
StringUtils.ordinalIndexOf
, jika tidak, berikut implementasinya:Posting ini telah ditulis ulang sebagai artikel di sini .
sumber
lastIndexOf
.Saya percaya solusi termudah untuk menemukan kejadian N dari String adalah dengan menggunakan StringUtils.ordinalIndexOf () dari Apache Commons.
Contoh:
sumber
Dua opsi sederhana terjadi:
charAt()
berulang kaliindexOf()
berulang kaliSebagai contoh:
Itu mungkin tidak berfungsi sebaik penggunaan
indexOf
berulang kali, tetapi mungkin lebih mudah untuk melakukannya dengan benar.sumber
Anda dapat mencoba sesuatu seperti ini:
Perhatikan bahwa saya melakukan beberapa asumsi di regex:
Seperti yang diminta dalam komentar, saya akan mencoba menjelaskan regex:
(/[^/]*){2}/([^/]*)
/[^/]*
adalah/
diikuti oleh[^/]*
(sejumlah karakter yang tidak/
),(/[^/]*)
mengelompokkan ekspresi sebelumnya dalam satu entitas. Ini adalah1
kelompok ekspresi pertama,(/[^/]*){2}
artinya grup tersebut harus sama persis dengan{2}
waktu,[^/]*
lagi-lagi sejumlah karakter yang bukan/
,([^/]*)
mengelompokkan ekspresi previos dalam satu entitas. Ini adalah2
grup ekspresi nd.Dengan cara ini Anda hanya perlu mendapatkan substring yang cocok dengan grup ke-2:
return m.group(2);
Gambar milik Debuggex
sumber
Saya membuat beberapa perubahan pada jawaban aioobe dan mendapatkan versi IndexOf terakhir ke-n, dan memperbaiki beberapa masalah NPE. Lihat kode di bawah ini:
sumber
null
sebagai argumen. Ini adalah perilaku paling umum di pustaka standar.Cocokkan apa saja diikuti dengan / dua kali, lalu lagi. Yang ketiga adalah yang Anda inginkan
The Matcher negara dapat digunakan untuk mengatakan di mana / terakhir adalah
sumber
sumber
Saat ini ada dukungan dari StringUtils Apache Commons Lang ,
Ini yang primitif:
untuk masalah Anda, Anda dapat membuat kode berikut:
StringUtils.ordinalIndexOf(uri, "/", 3)
Anda juga dapat menemukan kemunculan terakhir karakter dalam string dengan metode lastOrdinalIndexOf .
sumber
Mungkin Anda bisa mencapai ini melalui metode String.split (..) juga.
sumber
Pendekatan lain:
sumber
Jawaban ini menyempurnakan jawaban @aioobe. Dua bug dalam jawaban itu telah diperbaiki.
1. n = 0 harus mengembalikan -1.
2. kemunculan n kembali -1, tapi bekerja pada kemunculan n-1.
Coba ini !
sumber
sumber
sumber
Solusi saya:
sumber
Kode mengembalikan substring posisi kejadian ke-n alias lebar bidang. Contoh. Jika string "Stack overflow in low melow" adalah string untuk mencari kejadian kedua dari token "low", Anda akan setuju dengan saya bahwa itu adalah kejadian kedua pada subtring "18 dan 21" . indexOfOccurance ("Stack overflow in low melow", low, 2) mengembalikan 18 dan 21 dalam sebuah string.
sumber
sumber
// scala
// throw's -1 jika nilainya tidak ada untuk ke n kali, bahkan jika ada sampai n-1st time. // throw's index jika nilainya ada untuk ke-n kalinya
sumber