2010-09-29 33 views
41

PostgreSQL có hỗ trợ \b không?PostgreSQL Regex Word Ranh giới?

Tôi đang cố gắng \bAB\b nhưng không khớp với bất kỳ thứ gì, trong khi (\W|^)AB(\W|$) thì có. Hai biểu thức này về cơ bản giống nhau, đúng không?

Trả lời

51

PostgreSQL sử dụng \m, \M, \y\Y như ranh giới từ:

\m matches only at the beginning of a word 
\M matches only at the end of a word 
\y matches only at the beginning or end of a word 
\Y matches only at a point that is not the beginning or end of a word 

Xem Regular Expression Constraint Escapes trong cuốn hướng dẫn.

Ngoài ra còn có [[:<:]][[:>:]], khớp với phần đầu và phần cuối của từ. Từ the manual:

Có hai trường hợp đặc biệt của biểu thức khung: khung biểu thức [[:<:]][[:>:]] là hạn chế, phù hợp với chuỗi trống ở đầu và cuối của một từ tương ứng. Một từ được định nghĩa là một chuỗi các ký tự từ không được đặt trước và cũng không theo sau các ký tự từ. Một ký tự từ là một ký tự alnum (như được định nghĩa bởi ctype) hoặc dấu gạch dưới. Đây là một phần mở rộng, tương thích với nhưng không được chỉ định bởi POSIX 1003.2, và nên được sử dụng thận trọng trong phần mềm có thể được di chuyển đến các hệ thống khác. Các ràng buộc ràng buộc được mô tả dưới đây thường thích hợp hơn (chúng không còn tiêu chuẩn nữa, nhưng chắc chắn là dễ gõ hơn).

+1

Nice! Cảm ơn bạn! Tôi nghĩ rằng tôi đã tìm thấy trang đó trong các tìm kiếm của Google nhưng tôi không nghĩ rằng tôi đã cuộn xuống đủ xa :) – mpen

11

Một ví dụ đơn giản

select * from table_name where column ~* '\yAB\y'; 

này sẽ làm việc trong 9,1 và matche AB ab ab - text text ab text AB text-ab-text text AB text ...

Nhưng bạn phải caref ul trong 9.2. bạn phải sử dụng:

select * from sometable where name ~* '\\yAB\\y'; 

Lưu ý dấu gạch chéo kép.
Trong 9.2 các standard_conforming_strings được thiết lập để OFF bởi default.But bạn có thể đặt nó bằng tay:

set standard_conforming_strings=on; 

Sau đó: select * from table_name where column ~* '\yAB\y'; nên làm việc.

+1

Tôi sử dụng postgres 9.3.10 và 'value ~ * '\ yAB \ y'' hoạt động tốt. Ghi chú của bạn có phải là 9,2-cụ thể không? –

1

Tìm kiếm từ chính xác trong văn bản:

Tôi đang gặp sự cố sau.

tôi muốn tìm kiếm tất cả địa chỉ liên lạc trong đó có 'CTO' như lời chính xác trong tiêu đề, nhưng trong kết quả đã nhận được kết quả với tiêu đề có 'đạo diễn' trong nó, tôi đã sử dụng sau đây truy vấn

select * from contacts where title ilike '%cto%'; 

Tôi cũng thử với whitspaces xung quanh ký tự đại diện là '% cto%', nó đã được kết hợp với văn bản chứa 'cto', có kết quả như 'vp, cto và manger', nhưng không phải kết quả với tiêu đề chính xác là 'cto'.

tôi muốn cả hai 'vp, CTO và máng cỏ' và 'CTO' trong kết quả, nhưng không phải là 'giám đốc' trong kết quả

Sau đây làm việc cho tôi

select * from contacts where title ~* '\\ycto\\y'; 

~ Matches regular expression, case sensitive 
~* Matches regular expression, case insensitive  
+0

Khi bạn kết hợp cụm từ 'ILIKE'% cto% ', bạn chỉ cần thêm dấu cách vào cụm từ:' '' || cụm từ || '' ILIKE '% cto%' '. Điều này sẽ làm việc cho tiêu đề như 'cto'. Cảm ơn bạn, vì ý tưởng của bạn giúp tôi tìm ra giải pháp này: https://stackoverflow.com/questions/18080104/ilike-match-word-boundaries-postgresql-9/47120301#47120301 –

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