Bayangkan Anda mencoba untuk mencocokkan pola "stackoverflow".
Anda menginginkan yang berikut:
this is stackoverflow and it rocks [MATCH]
stackoverflow is the best [MATCH]
i love stackoverflow [MATCH]
typostackoverflow rules [NO MATCH]
i love stackoverflowtypo [NO MATCH]
Saya tahu cara mengurai stackoverflow jika memiliki spasi di kedua situs menggunakan:
/\s(stackoverflow)\s/
Sama dengan jika pada awal atau akhir suatu string:
/^(stackoverflow)\s/
/\s(stackoverflow)$/
Tetapi bagaimana Anda menentukan "spasi atau akhir string" dan "spasi atau awal string" menggunakan ekspresi reguler?
regex
preg-match
anonim-satu
sumber
sumber
\b
adalah pernyataan nol-lebar; tidak pernah mengkonsumsi karakter apa pun. Tidak perlu membungkusnya dengan lookaround.\b
adalah ASCII standar saja , yang mengatakan, tidak ada dukungan unicode. Jika Anda perlu mencocokkan kata-kata unicode, Anda tidak punya pilihan selain menggunakan ini: stackoverflow.com/a/6713327/1329367(?:^|\s)
(?<=\s|^)
dengan(?:(?<=\s)|(?<=^))
. Jika tidak, Anda mendapatkanerror: look-behind requires fixed-width pattern
\b
akan mempertimbangkan karakter lain - seperti ".
" sebagai pemecah kata, sedangkan penanya secara khusus mengatakan "spasi". solusi @ gordy tampaknya lebih baik.(^|\s)
akan cocok dengan ruang atau awal string dan($|\s)
untuk ruang atau akhir string. Bersama itu:sumber
$1string$2
.$
dan^
ke dalam kelas karakter, tetapi ini menunjukkan mereka hanya dapat dimasukkan ke dalam kelompok pola biasa.Inilah yang akan saya gunakan:
Dengan kata lain, cocokkan "stackoverflow" jika tidak didahului oleh karakter yang bukan spasi dan tidak diikuti oleh karakter yang bukan spasi.
Ini lebih rapi (IMO) daripada pendekatan "ruang-atau-jangkar", dan tidak menganggap string dimulai dan diakhiri dengan karakter kata seperti
\b
pendekatan yang dilakukan.sumber
\b
cocok dengan batas kata (tanpa benar-benar cocok dengan karakter apa pun), jadi yang berikut harus melakukan apa yang Anda inginkan:sumber
mystr = r'\bstack overflow\b'