2009-07-27 30 views
29

Tôi muốn khớp với @ hoặc 'at' trong regex. Ai đó có thể giúp đỡ? Tôi đã thử sử dụng? nhà điều hành, đem lại cho tôi/@ (at)/nhưng điều đó không làm việcLàm cách nào để bạn khớp một trong hai từ trong một cụm từ thông dụng?

+6

Ah, c'mon! Thay thế là những điều cơ bản. – Gumbo

+0

[Cụm từ thông dụng có chứa một từ hoặc một từ khác] (http://stackoverflow.com/q/17166618/995714) –

Trả lời

54

Hãy thử:?

/(@|at)/ 

Điều này có nghĩa một trong hai @ hoặc at nhưng không phải cả hai. Nó cũng được chụp trong một nhóm, vì vậy sau này bạn có thể truy cập vào đối sánh chính xác thông qua một backreference nếu bạn muốn.

+0

điều này có xử lý các trường hợp mà địa chỉ email giống như địa chỉ [email protected] hoặc latitudeataddress.com không? –

+0

Tại sao phải không? Bạn có ý nghĩa gì bởi "xử lý"? –

+0

nó sẽ tạo ra các kết quả dương tính giả là những gì tôi hỏi tôi đoán. –

32
/(?:@|at)/ 

câu trả lời của người thợ may sẽ thực hiện chụp hình paren; của tôi sẽ không. Mà bạn nên sử dụng phụ thuộc vào việc bạn muốn chụp paren.

+0

Có một số loại thay đổi không? Tôi chưa tìm thấy "?:". Chết tiệt google. – Qwerty

+3

@Qwerty: '(? :)' là nhóm mà không nắm bắt, trái ngược với '()' mà bắt. – chaos

+0

@chaos Damn, cảm ơn! – Qwerty

2

bạn đã thử

@|at 

mà làm việc cho (trong hương vị .NET regex) các văn bản sau đây

[email protected] johnsmithatgmail.com

+0

Điều này cũng sẽ khớp với 'jonsmith @ atgmail.com' Có cách nào để khớp với một trong hai nhưng không phải cả hai liên tiếp? Trường hợp sử dụng của tôi đang định tuyến cho một người có biệt hiệu. Tôi cần phải khớp 'www.domain.com/name' và' www.domain.com/nickname' nhưng không khớp 'www.domain.com/namenickname'. – Costa

3

nếu đó là chỉ có 2 thứ bạn muốn chụp, không cần regex

if (strpos($string,"@")!==FALSE || strpos($string,"at") !==FALSE) { 
    # do your thing 
} 
+1

Đúng. Tôi đã giả định đây là một phần của cái gì đó lớn hơn, nhưng nếu không, điều này có lẽ tốt hơn. –

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