2014-09-20 112 views
1

我使用Ruby 1.8.7 所有符號我有一個正則表達式是有效用Ruby 1.8.7匹配所有表情匹配除了表情

/\|?>?[:*;Xx8=<(%)D]-?'?,?o?\_^?[-DOo0S*Ppb3c:;\/\\|)(}{\]><]\)?|\(/ 

不過,我想匹配,除了所有的符號集那些在此正則表達式 例如,以下字符串

hi =as.) friend:) haha yay! ;) =) (test test) R&R I.O.U. :> :} :{ :< :< =) :S ;o) >:) :-| :| :o :*) %-()-:):)o: 8-0 8/ 8\ 8c :'(:'-(:(:*(:,(:-(:-/ :-S :-\ :-| :/ :O :S :\ :| =(>:(D: (o; 8-) ;) ;o) %-) (-: (: (o: 8) :) :-D :-P :D :P :P :] :o) :p <3 =) =] >:) >:D >=D 

我需要它來搭配

= .)() & . . . 

參考 - http://rubular.com/r/QpteIutq3B

我該如何做到這一點?

回答

1

我認爲這是一個非常困難的任務與正則表達式。

我的第一個想法是相匹配的符號之前使用負前向斷言(匹配表情),好像

(?!\|?>?[:*;Xx8=<(%)D]-?'?,?o?\_?[-DOo0S*Ppb3c:;\/\\|)(}{\]><]\)?|\()[:;._()] 
# works like "if no emoticon at this position, then match a symbol" 

,但不起作用。 (See demo.) 這部分是因爲你的模式檢測的誤報(相匹配的東西,是沒有表情),但它也有一個根本性的問題:它不會在表情的第一字符匹配,但它匹配表情符號的其餘部分。也許一個更有經驗的正則表達式用戶可以通過幻想的正則表達式來實現這個工作。


之所以這麼說,這裏只有我能想到的一個辦法: 對於要匹配,回顧後使用,並向前斷言,以確保它不是任何表情的一部分,每一個字符。這是一個lot的工作。例如,相匹配的字符=:;,我想出了以下模式:

(?<![(){}\[\]<>|D])(?<![(){}\[\]<>|][o-])[=:;](?!'?[o*,-]?[(){}\[\]<>|PpD\\\/OSso0]) 

的基本思路是這樣的:=:;通常用作表情的眼睛字符。因此,我們必須聲明沒有(可選的)鼻子o*,-並且沒有嘴(){}[]<>|PpD\/OSso0或者左邊或右邊。爲了使事情更糟糕,向後看斷言不允許量詞,因此重複的(?<![(){}\[\]<>|D])(?<![(){}\[\]<>|][o-])(其中一個匹配嘴巴,而另一個匹配嘴巴和鼻子)。

構建完整模式以匹配所有特殊字符需要付出很大的努力,而且可能會非常漫長和令人困惑。

如果你不是被迫用純正則表達式做這個,我建議使用正則表達式從字符串中刪除所有表情符號,然後找到所有剩餘的符號。


P.S.我製作了這種模式來匹配表情符號,它適合旋轉的笑臉,如:x,>:|,(:等。它也應該比你的模式產生更少的誤報。

更新#2:模式不再匹配數字。增加了對東部笑臉的支持。雜項小改進。現在匹配Wikipedia's list of emoticons體面的金額。 (See demo)

(?!\d\d)(?![a-zA-Z]{2})(?:(?:>?[:;=%8BXx]['‘’]?[-o*,^っ]?(?:(?P<mouth>[()|Il])(?P=mouth)*|[\/0\]o\\D\[PpSs<>{}CcOXx*[email protected]ÞþbL&?$#]))|(?:[()\\{}\/<\[>\]DOo0|SsXxlI*@q][-o*,]?['‘’]?[:=8;%Xx]<?))|(?P<head>\()?(?:(?P<eye>[<>v*.^~=ಠ-])?[_.-](?P=eye)|[o0O][_.-][o0O]|>[_.-]?<)['‘’]?(?(head)\))|xD|XD|XP|xP|DX|<3|\^\^|\\o\/|o\/|\\o 
+0

你是對的!我沒有做適當的後面。謝謝! – 2014-09-21 07:34:51

+0

它匹配像08和80這樣的幾個數字。我該如何照顧它? – 2014-09-22 20:50:50

+0

你說得對。我想最簡單的解決方案是使用前瞻斷言。我會用新模式更新我的答案。 – 2014-09-23 05:37:53