2013-08-01 34 views
8

muốn để phù hợp với từ i.v. case insensitiveRegex sử dụng ranh giới từ nhưng từ kết thúc bằng a. (Thời gian)

đã mẫu

(?i)\bi\.v\. 

nhưng muốn có một ranh giới từ ở cuối dòng
mô hình trên không ở chỗ nó phù hợp với
ivx

nhưng nếu tôi cố gắng và thêm một ranh giới công việc vào cuối

(?i)\bi\.v\.\b 

không thành công ở chỗ nó thậm chí không khớp với i.v. như tôi nghĩ rằng \b đang ăn theo nghĩa đen. như . là một từ phá vỡ
cần \. là tham lam

tôi muốn để phù hợp với
sam i.v. sam

không muốn đối sánh
sam.i.v.
i.v.sam

này có được gần gũi hơn

(?i)\bi\.v\.\s$ 

Nhưng nó không tìm thấy i.v. ở phần cuối của một dòng

+1

Vấn đề của bạn là gì? Tại sao bạn muốn một '\ b' ở cuối biểu thức? Điều gì có thể làm theo chuỗi 'i.v.' này khi nó được phép khớp? – Qtax

+0

@Qtax vì tôi chỉ muốn một từ phù hợp. Mẫu đầu tiên sẽ khớp với i.v.x. – Paparazzi

+0

Bạn có muốn khớp "i.v.x" nhưng không khớp với "xxi.v.x" không? Điều gì về "i.v. x" (với khoảng cách giữa. Và x)? –

Trả lời

16

\b chỉ đối sánh giữa ký tự chữ và số và ký tự không phải chữ và số (hoặc bắt đầu/kết thúc chuỗi). Do đó, nó không khớp với một số ., trừ khi ký tự chữ và số ngay sau dấu chấm đó.

Nếu ý định của bạn là để đảm bảo rằng không có nhân vật phi khoảng trắng sau sau khi chấm, sau đó bạn có thể xác định rằng việc sử dụng một negative lookahead assertion:

(?i)\bi\.v\.(?!\S) 

(?!\S) có nghĩa là "Khẳng định rằng các ký tự tiếp theo không phải là một tổ chức phi -ký tự khoảng trắng ".

Điều này nghe có vẻ hơi phức tạp - tại sao âm tính kép? Tại sao không phải là (?=\s) có nghĩa là "Xác nhận rằng ký tự tiếp theo là ký tự khoảng trắng"? Vâng, có một sự khác biệt tinh tế: Phiên bản thứ hai yêu cầu một ký tự khoảng trắng ở đó; điều đó có nghĩa là regex sẽ không khớp ở cuối chuỗi. Regex đầu tiên xử lý trường hợp góc đó là tốt.

Nếu bạn thường muốn khái niệm "từ ranh giới" có nghĩa là "không gian được phân định", thì bạn cần phải thay thế các \b đầu tiên cũng như:

(?i)(?<!\S)i\.v\.(?!\S) 

hoặc regex sẽ phù hợp sam.i.v. mà bạn don dường như không muốn nó.

+0

Nó có ý nghĩa và nó hoạt động – Paparazzi

+0

Chỉnh sửa gần đây của bạn cho câu hỏi của bạn làm tôi bối rối một chút (Tôi chỉ đọc nó sau khi tôi đã viết câu trả lời của tôi) - Tôi đã nhận xét về câu hỏi của bạn, bạn có thể nhìn vào nó? Tôi nghĩ rằng bạn cần phải thay thế ranh giới từ đầu tiên ... –

+0

Tôi đồng ý. \ b đối sánh trên? i.v. – Paparazzi

2

Về regex hiện tại của bạn:

Bạn không cần phải có \b sau dot kể từ khi chấm không được xem là một nhân vật từ nhưng dĩ nhiên chấm cần phải được thoát:

(?i)\bi\.v\. 

Nhưng bạn cần \b trước i để đảm bảo không khớp với ví dụ: hi

EDIT: (Dựa trên chỉnh sửa thêm của bạn)

Hãy thử regex này:

(?i)\bi\.v\.(?=\s|$) 
+0

không thành công trên i.v. sam – Paparazzi

+0

Xin vui lòng kiểm tra bản demo này: http://www.rubular.com/r/dXRpW6aaey – anubhava

+0

Đó là câu hỏi của tôi như một mẫu tôi muốn phù hợp với – Paparazzi

-1

Bạn có vẻ là rất nhầm lẫn với ranh giới từ và khái niệm tham lam. Điều tốt nhất bạn có thể làm là để đi đến những địa chỉ này:

  • một lượng hóa tham lam là gì:

http://www.regular-expressions.info/repeat.html

  • một ranh giới từ là gì:

http://www.regular-expressions.info/wordboundaries.html

Khi bạn đọc những lời giải thích này, tôi chắc chắn bạn sẽ nghĩ rằng vấn đề của bạn là vô lý.

+0

Tại sao lại là downvote? Bởi vì tôi không đưa ra câu trả lời? –

+0

Tôi nghĩ tôi đã làm những gì tôi phải làm, và tôi không quan tâm đến những ý kiến ​​khác. –

+0

Hiển thị cách tạo \. tham lam và tôi sẽ cung cấp cho bạn +1 – Paparazzi

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