Saya memiliki variabel string dengan konten:
varMessage =
"hi/thsid/sdfhsjdf/dfjsd/sdjfsdn\n"
"/my/name/is/balaji.so\n"
"call::myFunction(int const&)\n"
"void::secondFunction(char const&)\n"
.
.
.
"this/is/last/line/liobrary.so"
Dalam string saya harus menemukan sub-string:
"hi/thsid/sdfhsjdf/dfjsd/sdjfsdn\n"
"/my/name/is/balaji.so\n"
"call::myFunction(int const&)\n"
Bagaimana saya bisa menemukannya? Saya perlu menentukan apakah sub-string ada atau tidak.
Jawaban:
Anda dapat menggunakan
include?
metode ini:sumber
include?
peka huruf besar-kecil. Jadi jikamy_string
dalam contoh di atas akan menjadi sesuatu seperti"abcDefg"
(dengan huruf besarD
),include?("cde")
akan kembalifalse
. Anda mungkin ingin melakukandowncase()
sebelum meneleponinclude?()
.to_s
akan menyembunyikan masalah dan meningkatkan jarak antara sumber dan deteksi masalah, membuatnya lebih sulit untuk di-debug.Jika case tidak relevan, maka ekspresi reguler case-insensitive adalah solusi yang baik:
Ini juga akan berfungsi untuk string multi-line.
Lihat kelas Regexp Ruby untuk informasi lebih lanjut.
sumber
Regexp.escape
string. Untuk sebagian besar kasus penggunaan,some_str.include? substr.downcase()
harus bekerja lebih cepat dan lebih mudah dibaca.'aBcDe'.downcase.include?('bcd')
. Regex memiliki tujuan tetapi tidak menggunakannya saat metode bawaan lebih cepat. Benchmarking dengan data aktual yang sedang diuji dapat mengungkapkan banyak hal./bcd/i.match?('aBcDe')
Anda juga dapat melakukan ini ...
Contoh ini menggunakan
#[]
metode String Ruby .sumber
#include?
masih sedikit lebih cepat.#include?
tidak berfungsi ketika Anda bekerja dengan kalimat dengan spasi di dalam karena#include
memisahkan kalimat dalam kata-kata dan kemudian menggunakan kata-kata sebagai nilai array terpisah. Ini berfungsi dengan baik untuk kalimat. +1[]
metode String Ruby untuk informasi lebih lanjut.Memperluas jawaban Clint Pachl:
Pencocokan Regex di Ruby kembali
nil
ketika ekspresi tidak cocok. Ketika itu terjadi, itu mengembalikan indeks karakter di mana pertandingan terjadi. Sebagai contoh:Penting untuk dicatat bahwa hanya di Ruby
nil
dan ekspresi booleanfalse
bernilai false. Segala sesuatu yang lain, termasuk Array kosong, Hash kosong, atau Integer 0, bernilai true.Itu sebabnya
/foo/
contoh di atas berfungsi, dan mengapa.berfungsi seperti yang diharapkan, hanya memasuki bagian 'benar' dari
if
blok jika terjadi kecocokan.sumber
Ungkapan yang lebih ringkas daripada jawaban yang diterima di atas yang tersedia di Rails (dari 3.1.0 ke atas) adalah
.in?
:Saya juga berpikir itu lebih mudah dibaca.
Lihat
in?
dokumentasi untuk informasi lebih lanjut.Perhatikan lagi bahwa itu hanya tersedia di Rails , dan bukan Ruby murni.
sumber
in?
."cde".in? my_string
dalam hasil Ruby murniNoMethodError
. Tetapi denganrequire 'active_support/core_ext/object/inclusion'
itu berfungsi, yang dapat diambil baik dari Rails sendiri atau dari Cut-down Active Support Extensions .Cara ternary
ATAU
sumber
Anda dapat menggunakan metode Referensi Elemen String yang
[]
Di dalam
[]
dapat berupa substring literal, indeks, atau regex:Karena
nil
secara fungsional sama denganfalse
dan setiap substring kembali dari[]
adalahtrue
Anda dapat menggunakan logika seperti jika Anda menggunakan metode.include?
:Pastikan Anda tidak mengacaukan indeks dengan sub-string:
Anda juga dapat menggunakan regex:
sumber
Ketika Anda mengatakan 'centang', saya berasumsi Anda ingin boolean dikembalikan dalam hal ini Anda dapat menggunakan
String#match?
.match?
menerima string atau regex sebagai parameter pertama, jika yang pertama maka secara otomatis dikonversi ke regex. Jadi, use case Anda adalah:String#match?
memiliki manfaat tambahan dari argumen kedua opsional yang menentukan indeks untuk mencari string. Secara default ini diatur ke0
.sumber
Ini akan membantu Anda memeriksa apakah string berisi substring atau tidak
sumber