Regex: Chỉ định không gian của Wikipedia hoặc bắt đầu của không gian chuỗi


127

Hãy tưởng tượng bạn đang cố gắng khớp mẫu "stackoverflow".

Bạn muốn như sau:

 this is stackoverflow and it rocks [MATCH]

 stackoverflow is the best [MATCH]

 i love stackoverflow [MATCH]

 typostackoverflow rules [NO MATCH]

 i love stackoverflowtypo [NO MATCH]

Tôi biết cách phân tích stackoverflow nếu nó có khoảng trắng trên cả hai trang bằng cách sử dụng:

/\s(stackoverflow)\s/

Tương tự với nếu nó ở đầu hoặc cuối chuỗi:

/^(stackoverflow)\s/

/\s(stackoverflow)$/

Nhưng làm thế nào để bạn chỉ định "khoảng trắng hoặc kết thúc chuỗi" và "khoảng trắng hoặc bắt đầu chuỗi" bằng cách sử dụng biểu thức chính quy?

Câu trả lời:


172

Bạn có thể sử dụng bất kỳ thứ nào sau đây:

\b      #A word break and will work for both spaces and end of lines.
(^|\s)  #the | means or. () is a capturing group. 


/\b(stackoverflow)\b/

Ngoài ra, nếu bạn không muốn bao gồm khoảng trắng trong trận đấu của mình, bạn có thể sử dụng lookbehind / ahead.

(?<=\s|^)         #to look behind the match
(stackoverflow)   #the string you want. () optional
(?=\s|$)          #to look ahead.

8
\blà một khẳng định độ rộng bằng không; nó không bao giờ tiêu thụ bất kỳ nhân vật. Không cần phải bọc nó trong một cái nhìn.
Alan Moore

2
Lưu ý rằng trong hầu hết các triển khai regrec, chỉ \bASCII tiêu chuẩn , nghĩa là không hỗ trợ unicode. Nếu bạn cần ghép các từ unicode, bạn không có lựa chọn nào khác ngoài sử dụng từ này: stackoverflow.com/a/6713327/1329367
Mahn

4
Cách dễ dàng hơn để loại trừ lựa chọn nhóm khỏi trận đấu là(?:^|\s)
user2426679

7
cho trăn, thay thế (?<=\s|^)bằng (?:(?<=\s)|(?<=^)). Nếu không, bạn nhận đượcerror: look-behind requires fixed-width pattern
user2426679

4
Họ \bsẽ xem xét các ký tự khác - chẳng hạn như " ." như các từ ngắt, trong khi người hỏi đặc biệt nói "khoảng trắng". @ giải pháp của gordy có vẻ tốt hơn.
Mikhail T.

65

(^|\s)sẽ khớp với không gian hoặc bắt đầu chuỗi và ($|\s)cho không gian hoặc kết thúc chuỗi. Cùng nhau đó là:

(^|\s)stackoverflow($|\s)

4
đây là người duy nhất làm việc cho tôi cảm ơn bạn @gordy
robsonrosa

2
Nếu bạn sử dụng mẫu này để thay thế, hãy nhớ giữ khoảng trắng trong kết quả được thay thế bằng cách thay thế bằng mẫu $1string$2.
Mahn

Đây là người duy nhất làm việc cho tôi quá. Ranh giới từ dường như không bao giờ làm những gì tôi muốn. Đối với một, chúng khớp với một số ký tự bên cạnh khoảng trắng (như dấu gạch ngang). Đây giải quyết nó cho tôi vì tôi đã cố gắng để đưa $^vào một lớp nhân vật, nhưng chương trình này, họ chỉ có thể được đưa vào một nhóm mô hình thông thường.
felwithe

17

Đây là những gì tôi sẽ sử dụng:

 (?<!\S)stackoverflow(?!\S)

Nói cách khác, khớp "stackoverflow" nếu nó không có trước một ký tự không phải khoảng trắng và không được theo sau bởi một ký tự không phải khoảng trắng.

Đây là gọn gàng hơn (IMO) so với cách tiếp cận "không gian hoặc neo" và nó không cho rằng chuỗi bắt đầu và kết thúc bằng các ký tự từ giống như \bcách tiếp cận.


1
giải thích tốt về lý do tại sao để sử dụng này. tôi đã chọn cái này tuy nhiên chuỗi đang được thử là LUÔN LUÔN một dòng.
nặc danh-một

7

\b khớp với các ranh giới từ (không thực sự khớp với bất kỳ ký tự nào), vì vậy, những điều sau đây sẽ làm những gì bạn muốn:

\bstackoverflow\b

Đối với Python nó giúp để xác định nó một chuỗi nguyên , ví dụ:mystr = r'\bstack overflow\b'
Acumenus
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.