2012-09-25 30 views
5

Tôi đang viết một trình bẻ khóa hashtag cho facebook và mọi regex tôi gặp phải để có thẻ bắt đầu bằng # dường như bao gồm cả dấu chấm câu cũng như ký tự chữ và số. Dưới đây là ví dụ về những gì tôi muốn:Regex để phù hợp với tất cả thẻ bắt đầu bằng chữ và số, không có ký hiệu

Xin chào #world! Tôi đang # m4king một scraper #fac_book và muốn có một biểu thứC# thường xuyên tốt đẹp.

Tôi muốn nó để phù hợp với world, m4king, facexpression (lưu ý rằng tôi sẽ thích nó để cắt đứt nếu nó đạt đến dấu chấm câu, bao gồm cả dấu cách). Sẽ tốt hơn nếu nó không bao gồm biểu tượng băm, nhưng nó không phải là siêu quan trọng.

Chỉ trong trường hợp điều quan trọng là tôi sẽ sử dụng phương pháp quét chuỗi của ruby ​​để lấy được nhiều hơn một thẻ.

Cảm ơn đống trước!

Trả lời

5

Một regex như sau: #([A-Za-z0-9]+) phải khớp với những gì bạn cần và đặt nó vào nhóm chụp. Sau đó, bạn có thể truy cập nhóm này sau. Có lẽ this sẽ giúp làm sáng tỏ một số biểu thức thông thường (từ ngữ cảnh Ruby).

Regex ở trên sẽ bắt đầu khớp khi tìm thấy thẻ # và sẽ ném bất kỳ chữ cái hoặc số nào sau đây vào nhóm chụp. Một khi nó tìm thấy bất cứ thứ gì không phải là một chữ cái hoặc một chữ số, nó sẽ dừng kết hợp. Cuối cùng, bạn sẽ kết thúc với một nhóm có chứa những gì bạn đang sau.

+0

Cảm ơn! Tôi chắc chắn sẽ đọc nó! –

6
str = 'Hello #world! I am #m4king a #fac_book scraper and would like a nice regular #expression' 
str.scan(/#([A-Za-z0-9]+)/).flatten #=> ["world", "m4king", "fac", "expression"] 

Cuộc gọi tới #flatten là cần thiết vì mỗi nhóm chụp sẽ nằm bên trong mảng riêng của nó.

Ngoài ra, bạn có thể sử dụng nhìn đằng sau khớp mà sẽ phù hợp với ký tự chữ và chỉ sau một '#':

str.scan /(?<=#)[[:alnum:]]+/ #=> ["world", "m4king", "fac", "expression"] 
+0

Cảm ơn! Sẽ có lợi ích gì khi sử dụng phiên bản đầu tiên trong lần thứ hai? Nó có vẻ như thứ hai là đơn giản hơn nhiều (và tôi sẽ presume một chút performant hơn phải flatten đầu tiên) –

2

Dưới đây là một regex đơn giản #[[:alnum:]_]/. Lưu ý nó bao gồm dấu gạch dưới vì Facebook hiện bao gồm dấu gạch dưới như một phần của hashtags (cũng như twitter).

str = 'Hello #world! I am #m4king a #fac_book scraper and would like a nice regular #expression' 
str.scan(/#[[:alnum:]_]+/) 

Dưới đây là một cái nhìn về Rubular: http://rubular.com/r/XPPqwtVGN9

Các vấn đề liên quan