Biểu thức chính quy để khớp với chuỗi bắt đầu bằng "dừng"


97

Làm cách nào để tạo một biểu thức chính quy để khớp một từ ở đầu chuỗi. Chúng tôi đang tìm cách khớp stopở đầu một chuỗi và bất kỳ thứ gì có thể theo sau chuỗi đó.

Ví dụ, biểu thức phải khớp:

stop
stop random
stopping

Cảm ơn.

Câu trả lời:


184

Nếu bạn muốn chỉ khớp các dòng bắt đầu với ngừng sử dụng

^stop

Nếu bạn muốn nối các dòng bắt đầu bằng từ dừng, theo sau là dấu cách

^stop\s

Hoặc, nếu bạn muốn khớp các dòng bắt đầu bằng từ dừng nhưng theo sau là khoảng trắng hoặc bất kỳ ký tự không phải từ nào khác mà bạn có thể sử dụng (cho phép hương vị regex của bạn)

^stop\W

Mặt khác, những gì đứng sau khớp với một từ ở đầu chuỗi trên hầu hết các hương vị regex (trong các hương vị này \ w khớp với từ đối lập với \ W)

^\w

Nếu hương vị của bạn không có phím tắt \ w, bạn có thể sử dụng

^[a-zA-Z0-9]+

Hãy cảnh giác rằng thành ngữ thứ hai này sẽ chỉ khớp với chữ cái và số, không có bất kỳ ký hiệu nào.

Kiểm tra sổ tay hướng dẫn sử dụng regex của bạn để biết những phím tắt nào được phép và chúng khớp chính xác với những gì (và cách chúng xử lý với Unicode.)


27
+1 để khái quát câu trả lời của bạn. Tôi rất muốn xem thêm điều này trên Stack Overflow. Theo tôi, biến nó thành một nguồn học tập tốt hơn.
Jim

Làm thế nào để phân biệt chữ hoa chữ thường, tức là khớp với Dừng hoặc dừng hoặc sTop?
Elton Garcia de Santana

Phụ thuộc vào ngôn ngữ của bạn ... Tương thích Perl có thể sử dụng công cụ sửa đổi I. / regex / i .NET RegexOptions.IgnoreCase, v.v.
Vinko Vrsalovic

Đừng quên ^stop\b, điều này sẽ cho phép bất kỳ ranh giới nào, bao gồm cả cuối dòng
Mad Physicist

80

Thử cái này:

/^stop.*$/

Giải trình:

  • / charachters phân tách biểu thức chính quy (tức là chúng không phải là một phần của Regex per se)
  • ^ có nghĩa là khớp ở đầu dòng
  • . tiếp theo là * nghĩa là khớp với bất kỳ ký tự nào (.), bất kỳ số lần nào (*)
  • $ có nghĩa là đến cuối dòng

Nếu bạn muốn thực thi lệnh dừng được theo sau bởi một khoảng trắng, bạn có thể sửa đổi RegEx như vậy:

/^stop\s+.*$/
  • \S có nghĩa là bất kỳ ký tự khoảng trắng nào
  • + theo sau \ s có nghĩa là phải có ít nhất một ký tự khoảng trắng theo sau từ dừng

Lưu ý: Cũng nên nhớ rằng RegEx ở trên yêu cầu từ dừng phải được theo sau bởi một khoảng trắng! Vì vậy, nó sẽ không khớp với một dòng chỉ chứa: dừng lại


Không phải tất cả các ngôn ngữ đều sử dụng dấu gạch ngang để phân cách giữa các regex.
JAB

1
@Cat Megex: Đó chính là lý do tại sao tôi thêm lời giải thích. Nếu ngôn ngữ của bạn sử dụng một cái gì đó khác để phân định các regex, thay thế / với nhân vật thích hợp
Mike Dinescu

1
@Mez vâng, và sự dư thừa như vậy làm tăng cả độ rõ ràng và hiệu suất rexegg.com/regex-optimizations.html#anchors
MarredCheese

28

Nếu bạn muốn so khớp bất cứ điều gì sau một từ dừng lại, không chỉ ở đầu dòng, bạn có thể sử dụng: \bstop.*\b- từ theo sau bởi dòng

Từ cho đến cuối chuỗi

Hoặc nếu bạn muốn đối sánh từ trong chuỗi sử dụng \bstop[a-zA-Z]*- chỉ những từ bắt đầu bằng dấu dừng

Chỉ những từ bắt đầu bằng điểm dừng

Hoặc đầu dòng có dấu dừng ^stop[a-zA-Z]*cho từ chỉ - chỉ từ đầu tiên
Toàn bộ dòng ^stop.*- chỉ dòng đầu tiên của chuỗi

Và nếu bạn muốn so khớp mọi chuỗi bắt đầu với dừng bao gồm cả dòng mới, hãy sử dụng: /^stop.*/s- chuỗi nhiều dòng bắt đầu bằng dừng


19

Giống như @SharadHolani đã nói. Điều này sẽ không khớp với mọi từ bắt đầu bằng " dừng lại "

. Chỉ khi nó ở đầu dòng như " stop going ". @Waxo đã đưa ra câu trả lời đúng:

Cái này là hơi tốt hơn, nếu bạn muốn để phù hợp với bất kỳ từ nào bắt đầu với " stop " và chứa gì, nhưng chữ từ A đến Z .

\bstop[a-zA-Z]*\b

Điều này sẽ phù hợp với tất cả

dừng lại (1)

dừng ngẫu nhiên (2)

dừng lại (3)

muốn dừng lại (4)

làm ơn dừng lại (5)

Nhưng

/^stop[a-zA-Z]*/

sẽ chỉ khớp (1) cho đến (3), nhưng không khớp (4) & (5)


8
/stop([a-zA-Z])+/

Sẽ khớp với bất kỳ từ dừng nào (dừng, dừng, dừng, v.v.)

Tuy nhiên, nếu bạn chỉ muốn so khớp "dừng" ở đầu chuỗi

/^stop/

sẽ làm: D


2
Điều này sẽ phù hợp với "không ngừng diễn ra"
Alex B

1
Điều này sẽ không khớp với stop123 hoặc stop ,.
lostintranslation

7

Nếu bạn muốn so khớp bất kỳ thứ gì bắt đầu bằng "stop" bao gồm "stop going", "stop" và "stop", hãy sử dụng:

^stop

Nếu bạn muốn so khớp từ stop theo sau với bất kỳ thứ gì như trong "stop going", "stop this", nhưng không phải "stop" và không phải "stop", hãy sử dụng:

^stop\W

0

Tôi khuyên bạn không nên sử dụng phương pháp biểu thức chính quy đơn giản cho vấn đề này. Có quá nhiều từ là chuỗi con của các từ không liên quan khác, và bạn có thể sẽ khiến mình phát điên khi cố gắng khai thác các giải pháp đơn giản hơn đã được cung cấp.

Bạn sẽ muốn ít nhất một thuật toán tạo gốc ngây thơ (hãy thử trình tạo gốc Porter; có sẵn, mã miễn phí ở hầu hết các ngôn ngữ) để xử lý văn bản trước. Giữ văn bản đã xử lý này và văn bản được xử lý trước trong hai mảng phân chia không gian riêng biệt. Đảm bảo rằng mỗi ký tự không phải là bảng chữ cái cũng nhận được chỉ mục riêng của nó trong mảng này. Bất kể danh sách từ nào bạn đang lọc, hãy cắt chúng.

Bước tiếp theo sẽ là tìm các chỉ số mảng phù hợp với danh sách các từ 'dừng' gốc của bạn. Xóa chúng khỏi mảng chưa được xử lý, sau đó tham gia lại vào khoảng trắng.

Điều này chỉ phức tạp hơn một chút, nhưng sẽ là một cách tiếp cận đáng tin cậy hơn nhiều. Nếu bạn có bất kỳ nghi ngờ nào về giá trị của một cách tiếp cận theo định hướng NLP, bạn có thể muốn thực hiện một số nghiên cứu về những sai lầm nhỏ .


0

Nếu bạn muốn từ bắt đầu bằng "dừng", bạn có thể sử dụng mẫu sau. "^ dừng lại. *"

Điều này sẽ khớp các từ bắt đầu bằng dấu dừng, theo sau là bất kỳ thứ gì.


1
Bạn có thể không chỉ sử dụng "^stop"?
Stephen Rauch

Nó phụ thuộc. Trong khi nói về cú pháp java, chúng ta có thể sử dụng đối tượng Pattern và Matcher để sử dụng phương thức regex hoặc sử dụng trực tiếp .matches () với đối tượng String. Chúng khác nhau ở kết quả như sau: code String line = "stopped"; String pattern = "^stop"; Pattern r = Pattern.compile(pattern); Matcher m = r.matcher(line); System.out.println(m.find( )); //prints true System.out.println(line.matches(pattern)); //prints false
Manisha Chaurasia

1
Điều này chỉ khớp nếu từ ở đầu dòng. Nếu các từ bắt đầu bằng "dừng" ở giữa dòng hoặc ở cuối, thì regex này sẽ không khớp. @StephenRauch nếu bạn bỏ qua [az] *, bạn sẽ không nhận được bất kỳ từ nào như "dừng" toàn bộ. Trong trường hợp "dừng", bạn sẽ có "dừng" và "ping" sẽ bị thiếu.
Sedat Kilinc
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.