.Başka cevap burada ben çift negatif gider rağmen olumlu bir görünüm emrini önerdi:
(?<!\S)(\:\)|\:\(|<3|\:\/|\:-\/|\:\||\:p)(?!\S)
JavaScript desteklemiyor (?<!pattern)
, look-behind can be mimicked ederken:
test_string.replace(/(\S)?(\:\)|\:\(|<3|\:\/|\:-\/|\:\||\:p)(?!\S)/,
function($0, $1) { return $1 ? $0 : replacement_text; });
Tüm senin kodunun başına edildi vermedi Ön (?<!\S)
ile ve geri (?!\S)
ile soneki ile. Önek, boşluk olmayan bir karakteri izlememenizi sağlar, böylece geçerli olan tek geçerli girişler boşluktur veya hiçbir şey değildir (satırın başlangıcı). Sonek aynı şeyi yapmaz, böylece boşluk olmayan bir karakter tarafından takip edilmezsiniz. Ayrıca bkz. more thorough regex walk-through.
Sorunun kendisinden gelen yorumlardan biri, \b
(kelime sınırı) işaretçileridir. Bunları önermiyorum. Aslında bu öneri, istediğin şeyin tersini yapardı; \b:/
, p
ve :
arasında bir sözcük sınırı bulunduğundan, http://
ile eşleşecektir. Bu tür bir akıl yürütme, \B
(bir sözcük sınırı değil) örneğini önerir. \B:/\B
. Bu daha taşınabilir (bak-atlar yapmazken hemen hemen tüm regex ayrıştırıcılarıyla birlikte çalışır) ve bu durumda onu seçebilirsiniz, ancak etrafı çevirmeyi tercih ederim.
Neden birden fazla normal ifadede bölünmüyor? Ayrıca, yapabileceğiniz şey sınırlarla eşleşir, örneğin, '/ \ b: \) \ b /' – elclanrs
Doğru hatırlıyorsam hem [Twemoji] (https://github.com/twitter/twemoji/) ve [ Emojione] (https://github.com/Ranks/emojione/tree/master/lib/js) görüntü kodlarıyla bunu yapmak için JS kodu sağlar ve Github, NPM, bower vb. Ile aynı şeyin düzinelerce uygulaması vardır. – Crissov