2012-04-17 35 views
21

tôi cần một regex khớp với một biểu thức kết thúc bằng một ranh giới từ, nhưng không coi dấu gạch ngang là một đường biên. tức là nhận tất cả các biểu thức phù hợp bởiRanh giới từ regex không bao gồm dấu gạch ngang

type ([a-z])\b 

nhưng không khớp với ví dụ:

type a-1 

để nói lại: tôi muốn có một tương đương với các nhà điều hành ranh giới từ \ b đó thay vì sử dụng từ nhân vật lớp [A-Za-z0-9_], sử dụng lớp mở rộng: [A-Za-z0-9_-]

+0

Bạn đang sử dụng công cụ regex nào - đây là .NET, javascript, v.v ...? – Jay

+0

@Jay: Tôi đang sử dụng .NET – eyaler

Trả lời

19

Bạn có thể sử dụng một lookahead cho điều này, các ngắn nhất sẽ được sử dụng một lookahead tiêu cực:

type ([a-z])(?![\w-]) 

(?![\w-]) có nghĩa là "không phù hợp nếu nhân vật tiếp theo là trong \w hoặc là một -".

Dưới đây là một lựa chọn có sử dụng một lookahead bình thường:

type ([a-z])(?=[^\w-]|$) 

Bạn có thể đọc (?=[^\w-]|$) là "chỉ phù hợp nếu nhân vật tiếp theo là không trong lớp nhân vật [\w-], hay đây là kết thúc chuỗi".

Xem nó làm việc: http://www.rubular.com/r/NHYhv72znm

+2

điều này có thể được thực hiện mà không có sự cố không? – eyaler

4

Tôi đã có một vấn đề khá tương tự, ngoại trừ tôi không muốn xem xét các '*' như một nhân vật ranh giới. Đây là những gì tôi đã làm:

\b(?<!\*)[^\s\*]+)\b(?!*) 

Về cơ bản, nếu bạn đang ở một ranh giới từ, hãy nhìn lại một ký tự và không khớp với ký tự trước đó là '*'. Nếu bạn đang ở giữa, không phù hợp trên một không gian hoặc dấu hoa thị. Nếu bạn đang ở cuối, hãy đảm bảo rằng kết thúc không phải là dấu hoa thị. Trong trường hợp của bạn, tôi nghĩ bạn có thể sử dụng \ w thay vì \ s. Đối với tôi, điều này đã làm việc trong các trường hợp sau:

*word 
wo*rd 
word* 
+2

Regex của bạn có cú pháp không hợp lệ – MaxZoom

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