Bagaimana saya harus menulis regex agar cocok dengan kata tertentu?

21

Saya sudah mencoba untuk membuat regex tertentu bekerja tetapi saya tidak bisa mendapatkannya untuk melakukan apa yang saya butuhkan.

Pada dasarnya, saya ingin mencari ROCKET. Regex harus cocok dengan ROCKET dalam huruf besar atau kecil, dan dengan atau tanpa tanda baca, tetapi tidak ketika bagian dari kata lain. Jadi, regex akan memicu salah satu dari ini:

rocket
RoCKEt
hi Rocket
This is a rocket.
ROCKET's engine

tetapi TIDAK memicu pada ROCKET ketika ditemukan dalam sesuatu seperti

Rocketeer
Sprocket

Saya sudah mencoba untuk memperbaikinya menggunakan generator regex online tetapi saya tidak bisa mencocokkannya dengan tepat.

Kefka
sumber
1
Ini adalah salah satu situasi [jarang] di mana pertanyaan mungkin lebih cocok untuk Stack Overflow. Pastikan untuk menyediakan bahasa dan / atau platform karena setiap bahasa memiliki kekhasan tersendiri. Misalnya, Windows. .Net dan kelas Regex . (Biasanya, sebaliknya. Stack Overflow mendapatkan ratusan pertanyaan di luar topik dari pengembang yang lebih cocok untuk Pengguna Super).
jww

Jawaban:

14

Saya sarankan untuk membookmark Referensi Cepat Ekspresi Reguler MSDN

Anda ingin mencapai kecocokan huruf besar-kecil untuk kata "roket" yang dikelilingi oleh karakter non-alfanumerik. Regex yang berfungsi adalah:

\W*((?i)rocket(?-i))\W*

Yang akan dilakukan adalah mencari nol atau lebih (*) karakter non-alfanumerik (\ W), diikuti oleh case rocket versi ((? I) rocket (??)) Yang tidak sensitif, diikuti lagi dengan nol atau lebih ( *) karakter non-alfanumerik (\ W). Tanda kurung tambahan di sekitar istilah pencocokan roket memberikan kecocokan ke grup terpisah. Dengan demikian kata roket akan berada dalam grup pertandingan 1.

UPDATE 1: Matt mengatakan dalam komentar bahwa regex ini akan digunakan dengan python. Python memiliki sintaks yang sedikit berbeda. Untuk mencapai hasil yang sama dengan python, gunakan regex ini dan berikan re.IGNORECASEopsi ke compileatau matchfungsi.

\W*(rocket)\W*

Pada Regex101 ini dapat disimulasikan dengan memasukkan "i" di kotak teks di sebelah input regex.

UPDATE 2 Ismael telah menyebutkan, bahwa regex tidak cukup benar, karena mungkin cocok dengan "1rocket1". Dia memposting solusi yang jauh lebih baik, yaitu

(?:^|\W)rocket(?:$|\W)

Xaser
sumber
1
Menguji ini dengan penguji regex online ( regex101.com misalnya) menunjukkan itu tidak valid dan tidak cocok dengan string contoh yang saya masukkan. Ini dimaksudkan untuk digunakan sebagai bagian dari skrip python. Apakah itu membuat perbedaan dalam bagaimana seharusnya ditulis?
Kefka
1
ya benar. Anda dapat melihat di regex101.com bahwa Anda dapat memilih "rasa" regex di kiri atas, python sedikit berbeda. Saya akan memperbarui jawaban saya dengan python yang setara.
Xaser
1
Terima kasih. Saya pikir regex pada dasarnya independen terhadap bahasa.
Kefka
1
Mereka seharusnya, tetapi perbedaan implementasi kecil ada.
Xaser
2
Dan \W*(rocket)\W*korek api lrocketl. Seharusnya (?:^|\W)(rocket)(?:$|\W)(tanpa *dan Anda harus memeriksa apakah itu cocok dengan awal dan / atau akhir string).
Ismael Miguel
10

Saya pikir pandangan ke depan terlalu banyak dalam kasus ini, dan Anda akan lebih baik menggunakan batas kata dengan ignorecaseopsi,

\brocket\b

Dengan kata lain, dengan python:

>>> x="rocket's"
>>> y="rocket1."
>>> c=re.compile(r"\brocket\b",re.I)  # with the ignorecase option
>>> c.findall(y)
[]
>>> c.findall(x)
['rocket']
beroe
sumber
secara teknis, kelompok-kelompok yang tidak menangkap bukan merupakan solusi, tetapi opsi / b menghasilkan hasil yang sama persis dengan solusi Ismael, tetapi mungkin sedikit lebih elegan.
Xaser
1

Dengan grepdan sed, Anda bisa menggunakannya \<rocket\>. Dengan grep, yang -ipilihan akan membuat case-sensitive ( i gnore kasus):

grep -i '\<rocket\>'

Saya tidak tahu cara apa pun untuk membuat semua sedregex tidak peka terhadap huruf besar-kecil, tetapi selalu ada cara manusia gua:

sed -n '/\<[Rr][Oo][Cc][Kk][Ee][Tt]\>/p'
Scott
sumber
0

Gunakan opsi Cari hanya untuk seluruh kata.

Sejauh tanda baca, Anda tidak bisa menjawabnya sampai Anda tahu rasanya.

Itu utas yang sangat lama, jadi diposting untuk seseorang yang mungkin berkunjung dengan kebutuhan, nanti. Orang yang memulai utas mungkin telah pindah ke hal lain ... Tidak?

Rex Schweiss
sumber
Apa yang whole words only optionmenggunakan grepatau php? Maaf, tetapi jawaban Anda tidak memberikan nilai tambah dibandingkan dengan jawaban lainnya.
Toto