2009-04-11 10 views

Odpowiedz

16

Testowany:

/@([a-z0-9_]+)/i 

W Ruby (IRB)

>> "RT @user1: who are @thing and @user2?".scan(/@([a-z0-9_]+)/i) 
=> [["user1"], ["thing"], ["user2"]] 

W Pythonie

>>> import re 
>>> re.findall("@([a-z0-9_]+)", "RT @user1: who are @thing and @user2?", re.I) 
['user1', 'thing', 'user2'] 

w PHP:

<?PHP 
$matches = array(); 
preg_match_all(
    "/@([a-z0-9_]+)/i", 
    "RT @user1: who are @thing and @user2?", 
    $matches); 

print_r($matches[1]); 
?> 

Array 
(
    [0] => user1 
    [1] => thing 
    [2] => user2 
) 
+0

Będziesz musiał dodać grupę przechwytywania całego [A-z0-9_], czyli @ ([a-zA-Z0-9 _] +) –

+0

Dzięki, to działa dobrze! Ostatnie pytanie: kiedy musi być spacja przed znakiem "@" lub musi być na początku, czy mogę użyć następującego wyrażenia? "/ (| ^) @ ([a-z0-9 _] +)/i" – caw

+0

Użyj lookbehind - http://www.regular-expressions.info/lookaround.html – user4812

0

To powinno wystarczyć (użyłem nazwane przechwytuje dla wygody):.?

+ @ (? [A-zA-Z0-9 _] +):? [^ @] + @ ([^ \ s] +) [^ @] + @ ([a-z 0-9 _] +)

+0

PHP pokazuje komunikat o błędzie, gdy używam wyrażenia. Coś w rodzaju "brakującego ogranicznika na końcu" lub tak. – caw

1

próby iterację (findall) z tego wyrażenia regularnego:?

(@[\w-]+) 

bye

+0

proste ... ładne! łączenie ze skanowaniem (ruby) w celu uzyskania tablicy dopasowań: text.scan (/ @ [\ w -] + /) – Danny

2
/(?<!\w)@(\w+)/ 

Powyższe obejmuje następujący scenariusz, która inną odpowiedź W tym wątku nie należy:

  • Znak @, który nie powinien być nazwą użytkownika, np. "mój adres e-mail to [email protected]"
  • Nadal zezwala na nazwę użytkownika znajdującą się na początku ciągu znaków, np. "@username lorem ipsum ..."
+0

Dzięki. Nikt nigdy nie rozważa problemu z adresem e-mail! – innonate