2015-01-21 19 views
5

yanı sıra, normal ifadeler (gibi :), <3, :/, :p)Regex eşleşen ifadeler

( :smile:, :heart:, :confused:, :stuck_out_tongue: benzeri) - http ://example

  • Normal dizeleri veya URL: bazen bu karakter dizileri meydana gelecek çünkü

    Ben ifade sözdizimi ile sorun yaşıyorum. emojisi sözdizimi içinde com

  • - :p encil: Diğer karakterler onlara yakın olduğunda

nasıl bu ifade karakter dizilerini değil bulabilirim? http://regexr.com/3a8o5

+0

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

+0

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

cevap

5

Maç emojisi ilk (bakacak örnek) ve daha sonra bir sonlandırma boşluk veya Yenisatır için kontrol edin:

(\:\w+\:|\<[\/\\]?3|[\(\)\\\D|\*\$][\-\^]?[\:\;\=]|[\:\;\=B8][\-\^]?[3DOPp\@\$\*\\\)\(\/\|])(?=\s|[\!\.\?]|$) 

Bu regex aşağıdaki (tercih emoji maçları) grup 1 eşleşen maçı dönen:

:(:) :P :p :O :3 :| :/ :\ :$ :* :@ 
:-(:-) :-P :-p :-O :-3 :-| :-/ :-\ :-$ :-* :[email protected] 
:^(:^) :^P :^p :^O :^3 :^| :^/ :^\ :^$ :^* :^@ 
): (: $: *: 
)-: (-: $-: *-: 
)^: (^: $^: *^: 
<3 </3 <\3 
:smile: :hug: :pencil: 

Ayrıca boşluk ek olarak ayırıcı olarak, terminal noktalama destekler.

Sen fazla ayrıntı görmek ve buradan test edebilirsiniz: Sen aralıklarıyla ilgili regex görünüm arounds istiyorum https://regex101.com/r/aM3cU7/4

+0

Evet! İfade seçimini zaten yaptım ama buradaki anahtar mevcut regeximin sonuna '' (? = \ S | [\! \. \, \?] | $) 'Ekliyor. Teşekkürler! –

+0

Benim regex demomu burada yapılan eklentilerle güncellendi: http://regexr.com/3a91e –

+3

'(' veya ')' ile eşleşirken, geçerli bir parantez kümesinin parçası olmadığını da kontrol etmelisiniz. '8)' ifadesini buraya uydurmak istiyorum: 'blah blah bug (iOS 8'de yeniden üretildi)'. Kısacası, bu gerçekten regex ile iyi idare edebileceğiniz bir şey değildir. –

1

I:

(\:\)|\:\(|<3|\:\/|\:-\/|\:\||\:p) 

Burada eylem bunun bir demo ile oynayabilir:

tüm ifadeler için kullanıyorum tüm regex, işte bir aşağı trimed versiyonu kocaman oluyor ise Bu ifadelerin yaygın olarak önce ve sonra boşluklarla birlikte kullanılacağını varsayalım. O zaman beyaz bir alanı temsil ettiği için, \s aradığınız şey olabilir.

Sonra düzenli ifade javascript özelliğini kullandığınız için

\s+(\:\)|\:\(|<3|\:\/|\:-\/|\:\||\:p)\s 
1

bir positive look-ahead for a space

([\:\<]-?[)(|\\/pP3D])(?:(?=\s)) 
|  |  |   | 
|  |  |   | 
|  |  |   |-> match last separating space 
|  |  |-> match last part of the emot 
|  |-> it may have a `-` or not 
|-> first part of the emoticon 

olun olacaktı ve arounds bakmak erişiminiz yok:

/([\:\<]-?[)|\\/pP3D])(\s|$)/g.exec('hi :) ;D'); 

Ve sonra sadece splice() elde edilen dizi son girişinden kalem: en az büyük ihtimalle bir boşluk)

0

.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.

+0

JavaScript kullanıyorum ve JS :( –

+0

'da lookbehinds desteklenmiyor. @ChrisBarr ah, iyi bir nokta.Yedek arama için bir işlev kullanarak çözüldü. –

İlgili konular