2012-02-19 36 views
21

Nói chung, tôi muốn tìm trong chuỗi một số chuỗi con nhưng chỉ khi nó được chứa ở đó.Regex tìm từ trong chuỗi

Tôi có biểu hiện:

^.*(\bpass\b)?.*$ 

Và chuỗi thử nghiệm:

high pass h3 

Khi tôi kiểm tra chuỗi thông qua biểu hiện tôi thấy rằng toàn bộ chuỗi được tìm thấy (nhưng nhóm "vượt qua" không):

match : true 
groups count : 1 
group : high pass h3 

Nhưng điều tôi cần là khớp đó có 2 nhóm: 1: mật khẩu cao h3 2: pass

Và khi tôi thử nghiệm, ví dụ, chuỗi - h3 cao, tôi vẫn đã 1 nhóm tìm thấy - h3 cao

Làm thế nào tôi có thể làm điều này?

+1

1. nền tảng gì (không phải tất cả triển khai regex đều giống nhau): Perl, Python, Java, .NET, ...? 2. "chỉ khi nó được chứa ở đó" là không rõ ràng. – Richard

+1

Tại sao bạn muốn toàn bộ chuỗi là kết quả phù hợp? – Mat

+0

Nó có thể là nhiều dòng, đưa anh ta những dòng hoàn chỉnh bao gồm cả từ được tìm thấy. – Mario

Trả lời

5

Bạn chỉ thiếu một chút để nó hoạt động (cộng thêm ? ở sai vị trí).

Nếu bạn muốn khớp với hiện tượng xoắn: ^(.*?)(\bpass\b)(.*)$. Nếu bạn muốn khớp với lần xuất hiện cuối cùng: ^(.*)(\bpass\b)(.*?)$.

Điều này sẽ dẫn đến 3 nhóm chụp: Mọi thứ trước đây, đối sánh chính xác và mọi thứ tiếp theo.

. sẽ khớp (tùy thuộc vào cài đặt của bạn gần như) mọi thứ, nhưng chỉ một ký tự đơn. ? sẽ làm cho phần tử trước không bắt buộc, tức là xuất hiện không hoàn toàn hoặc chính xác một lần. * sẽ khớp với phần tử trước nhiều lần, nghĩa là không phải ở tất cả hoặc không giới hạn số lần. Điều này sẽ khớp với nhiều ký tự nhất có thể. Nếu bạn kết hợp cả hai thành *?, bạn sẽ nhận được kết quả không phù hợp, về cơ bản khớp với ít ký tự nhất có thể (xuống tới 0).

Edit: Khi tôi đọc bạn chỉ muốn pass và chuỗi hoàn chỉnh, tùy tình hình thực hiện/ngôn ngữ của bạn, sau đây là đủ: ^.*(\bpass\b).*?$ (một lần nữa, trận đấu ungreedy có thể được hoán đổi với một tham lam). Bạn sẽ nhận được toàn bộ biểu thức/kết hợp thành nhóm 0 và kết quả được xác định đầu tiên là nhóm 1.

+0

Thật không may giải pháp này không hoạt động trong C# regex, string - "high h3", toán học không được tìm thấy ở tất cả, nhưng tôi mong rằng nếu chuỗi không tìm thấy match sẽ trả về toàn bộ chuỗi như một kết quả phù hợp. Tại sao tôi cần là bởi vì đây là phần duy nhất của biểu thức regex của tôi và có một mẫu khác cho seacrh mà nên làm việc ngay cả khi "vượt qua" không tìm thấy. – baio

+0

Ah? "pass" nên là tùy chọn? Bạn có nghĩ về việc xác định các chuỗi thay thế bằng cách sử dụng '|'? Ví dụ. một cái gì đó như '^. *? (\ b (?: thông qua | không thành công) \ b). *? $' sẽ khớp với cả hai lựa chọn thay thế. Tại sao bạn thậm chí phải phù hợp với toàn bộ dòng, xem xét đó là những gì bạn có thể vượt qua? Bạn có thể thực hiện bất kỳ chuỗi tùy chọn nào bằng cách thêm '?', Nhưng điều này có thể có kết quả không mong muốn khi sử dụng các đối sánh thẻ hoang dã có thể bao gồm "từ khóa" của bạn. – Mario

3

Một khoảng thời gian chỉ phù hợp với một nhân vật duy nhất, vì vậy bạn

^.(\bpass\b)?.$ 

là phù hợp:

  • Bắt đầu nhập
  • Một ký tự đơn
  • Tùy chọn
    • Lời ranh giới
    • "vượt qua"
    • Lời ranh giới
  • Độc char
  • Kết thúc đầu vào

mà tôi sẽ không mong đợi để phù hợp với "cao vượt qua h3" chút nào.

Các biểu thức chính quy:

pass 

(không metacharacters) sẽ phù hợp với bất kỳ chuỗi chứa "đạt" (nhưng sau đó như vậy sẽ là "tìm chuỗi trong chuỗi" chức năng, và điều này có lẽ sẽ nhanh hơn mà không có sự phức tạp của một regex).

43

Sử dụng này một:

^(.*?(\bpass\b)[^$]*)$ 
  1. chụp đầu tiên cho toàn bộ dòng.
  2. Chụp lần thứ hai cho từ mong muốn.

Kiểm tra demo.

More giải thích:

  ┌ first capture 
      | 
⧽------------------⧼ 
^(.*?(\bpass\b)[^$]*)$ 
    ⧽-⧼   ⧽---⧼ 
    | ⧽--------⧼ | 
    |  |  └ all characters who are not the end of the string 
    |  | 
    |  └ second capture 
    | 
    └ optional begin characters 
+0

Thansks! Nhưng vấn đề là những gì tôi cần rằng các trận đấu (toàn bộ văn bản) sẽ được tìm thấy ngay cả khi "vượt qua" không phải là trong chuỗi thử nghiệm, xin vui lòng xem demo của bạn. Có thể không? – baio

+0

Kiểm tra điều này: http://www.myregextester.com/?r=aa94f52d '^ (. *? (\ Bpass \ b) [^ $] * | [^ $] *) $' – piouPiouM

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