Làm thế nào tôi nên viết một regex để phù hợp với một từ cụ thể?


21

Tôi đã cố gắng để một regex cụ thể hoạt động nhưng tôi không thể làm cho nó để làm những gì tôi cần.

Về cơ bản, tôi muốn nó tìm kiếm ROCKET. Regex phải khớp với ROCKET trong trường hợp trên hoặc dưới và có hoặc không có dấu chấm câu, nhưng không phải là một phần của từ khác. Vì vậy, regex sẽ kích hoạt bất kỳ thứ nào trong số này:

rocket
RoCKEt
hi Rocket
This is a rocket.
ROCKET's engine

nhưng KHÔNG kích hoạt trên ROCKET khi nó được tìm thấy trong một cái gì đó như

Rocketeer
Sprocket

Tôi đã cố gắng làm cho nó đúng bằng cách sử dụng trình tạo regex trực tuyến nhưng tôi không thể làm cho nó khớp chính xác.


1
Đây là một trong những tình huống [không thường xuyên] trong đó câu hỏi có thể phù hợp hơn với Stack Overflow. Hãy chắc chắn cung cấp một ngôn ngữ và / hoặc nền tảng vì mỗi ngôn ngữ có những đặc thù riêng. Ví dụ: Windows. .Net và lớp Regex . (Thông thường, theo cách khác. Stack Overflow nhận được hàng trăm câu hỏi ngoài chủ đề từ các nhà phát triển phù hợp hơn với Super User).
22:00

Câu trả lời:


14

Tôi đề nghị đánh dấu Tài liệu tham khảo nhanh biểu thức chính quy MSDN

bạn muốn đạt được một kết hợp không phân biệt chữ hoa chữ thường cho từ "tên lửa" được bao quanh bởi các ký tự không chữ và số. Một regex sẽ hoạt động sẽ là:

\W*((?i)rocket(?-i))\W*

Những gì nó sẽ làm là tìm kiếm các ký tự không hoặc nhiều chữ số (*) không chữ số (\ W), theo sau là một phiên bản không nhạy cảm của tên lửa ((? I) (? - i)), tiếp theo là 0 hoặc hơn ( *) ký tự không chữ và số (\ W). Các dấu ngoặc đơn bổ sung xung quanh thuật ngữ khớp tên lửa sẽ gán trận đấu cho một nhóm riêng biệt. Tên lửa từ đó sẽ nằm trong nhóm 1.

CẬP NHẬT 1: Matt nói trong bình luận rằng regex này sẽ được sử dụng trong python. Python có một cú pháp hơi khác nhau. Để đạt được kết quả tương tự trong python, hãy sử dụng regex này và truyền re.IGNORECASEtùy chọn cho hàm compilehoặc match.

\W*(rocket)\W*

Trên Regex101, điều này có thể được mô phỏng bằng cách nhập "i" vào hộp văn bản bên cạnh đầu vào regex.

CẬP NHẬT 2 Ismael đã đề cập, rằng regex không hoàn toàn chính xác, vì nó có thể khớp với "1rocket1". Ông đã đăng một giải pháp tốt hơn nhiều, cụ thể là

(?:^|\W)rocket(?:$|\W)


1
Thử nghiệm điều này với trình kiểm tra regex trực tuyến ( ví dụ regex101.com ) cho thấy nó là không hợp lệ và không khớp với chuỗi ví dụ mà tôi nhập. Điều này được dự định sẽ được sử dụng như là một phần của tập lệnh python. Điều đó có làm cho bất kỳ sự khác biệt trong cách nó nên được viết?
Kefka

1
đúng vậy bạn có thể thấy trên regex101.com rằng bạn có thể chọn một "hương vị" regex ở phía trên bên trái, python hơi khác một chút. Tôi sẽ cập nhật câu trả lời của tôi với con trăn tương đương.
Xaser

1
Cảm ơn. Tôi nghĩ rằng regexes về cơ bản là ngôn ngữ độc lập.
Kefka

1
Họ nên được, nhưng sự khác biệt thực hiện nhỏ tồn tại.
Xaser

2
\W*(rocket)\W*phù hợp lrocketl. Nó phải là (?:^|\W)(rocket)(?:$|\W)(không có *và bạn phải kiểm tra xem nó có khớp với phần đầu và / hoặc phần cuối của chuỗi không).
Ismael Miguel

10

Tôi nghĩ rằng các giao diện này là quá mức cần thiết trong trường hợp này và bạn sẽ tốt hơn nếu sử dụng ranh giới từ với ignorecasetùy chọn này,

\brocket\b

Nói cách khác, trong python:

>>> x="rocket's"
>>> y="rocket1."
>>> c=re.compile(r"\brocket\b",re.I)  # with the ignorecase option
>>> c.findall(y)
[]
>>> c.findall(x)
['rocket']

về mặt kỹ thuật, các nhóm không bắt giữ không có vẻ ngoài, tuy nhiên tùy chọn / b mang lại kết quả chính xác như giải pháp của Ismael, nhưng có thể thanh lịch hơn một chút.
Xaser

1

Với grepsed, bạn có thể sử dụng \<rocket\>. Với grep, -itùy chọn sẽ làm cho nó không phân biệt chữ hoa chữ thường ( i gnore case):

grep -i '\<rocket\>'

Tôi không biết cách nào để khiến tất cả các biểu thức sedkhông nhạy cảm, nhưng luôn có cách thức thượng cổ:

sed -n '/\<[Rr][Oo][Cc][Kk][Ee][Tt]\>/p'

0

Sử dụng tùy chọn Tìm kiếm cho toàn bộ từ.

Theo như dấu câu, bạn không thể trả lời cho đến khi bạn biết hương vị / hương vị.

Đây là một chủ đề rất cũ, vì vậy, được đăng cho một người có thể truy cập có nhu cầu, sau đó. Những người bắt nguồn từ chủ đề có thể đã chuyển sang thứ khác ... Không?


Những gì đang whole words only optionsử dụng grephoặc php? Xin lỗi, nhưng câu trả lời của bạn không đưa ra bất kỳ giá trị gia tăng nào so với các câu trả lời khác.
Toto
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.