Biểu thức chính quy để cho phép khoảng trắng giữa các từ


188

Tôi muốn một biểu thức chính quy ngăn các ký hiệu và chỉ cho phép các chữ cái và số. Regex dưới đây hoạt động rất tốt, nhưng nó không cho phép khoảng trắng giữa các từ.

^[a-zA-Z0-9_]*$

Ví dụ: khi sử dụng biểu thức chính quy này "HelloWorld" là tốt, nhưng "Hello World" không khớp.

Làm thế nào tôi có thể điều chỉnh nó để cho phép không gian?

Câu trả lời:


367

tl; dr

Chỉ cần thêm một không gian trong lớp nhân vật của bạn .

^[a-zA-Z0-9_ ]*$

 


Bây giờ, nếu bạn muốn nghiêm khắc ...

Những điều trên không chính xác. Do thực tế *có nghĩa là không hoặc nhiều hơn , nó sẽ khớp với tất cả các trường hợp sau đây mà người ta thường không có nghĩa là khớp:

  • Một chuỗi rỗng, "".
  • Một chuỗi bao gồm toàn bộ khoảng trắng, "".
  • Một chuỗi dẫn và / hoặc các vệt có khoảng trắng, "Hello World".
  • Một chuỗi chứa nhiều khoảng trắng ở giữa các từ, "Hello World".

Ban đầu tôi không nghĩ những chi tiết như vậy đáng để đi vào, vì OP đã hỏi một câu hỏi cơ bản đến mức có vẻ nghiêm khắc không phải là vấn đề đáng lo ngại. Bây giờ câu hỏi đã trở nên phổ biến, tuy nhiên, tôi muốn nói ...

... sử dụng câu trả lời của @ stema .

Mà, trong hương vị của tôi (không sử dụng \w) dịch thành:

^[a-zA-Z0-9_]+( [a-zA-Z0-9_]+)*$

(Vui lòng upvote @stema bất kể.)

Một số điều cần lưu ý về câu trả lời này (và @ stema's):

  • Nếu bạn muốn cho phép nhiều khoảng trắng giữa các từ (giả sử, nếu bạn muốn cho phép không gian kép ngẫu nhiên hoặc nếu bạn đang làm việc với văn bản được sao chép từ PDF), thì hãy thêm dấu cách +sau: khoảng trắng :

    ^\w+( +\w+)*$
  • Nếu bạn muốn cho phép các tab và dòng mới (ký tự khoảng trắng), sau đó thay thế khoảng trắng bằng \s+:

    ^\w+(\s+\w+)*$

    Ở đây tôi đề xuất +theo mặc định bởi vì, ví dụ, các dòng Windows bao gồm hai ký tự khoảng trắng theo thứ tự \r\n, vì vậy bạn sẽ cần phải +bắt cả hai.

Vẫn không làm việc?

Kiểm tra phương ngữ của biểu thức thông thường bạn đang sử dụng. * Trong các ngôn ngữ như Java, bạn sẽ phải thoát khỏi dấu gạch chéo ngược, nghĩa là \\w\\s. Trong các ngôn ngữ và tiện ích cũ hơn hoặc cơ bản hơn, như sed, \w\skhông được xác định, vì vậy hãy viết chúng ra với các lớp ký tự, ví dụ [a-zA-Z0-9_][\f\n\p\r\t], tương ứng.

 


* Tôi biết câu hỏi này được gắn thẻ, nhưng dựa trên hơn 25.000 lượt xem, tôi đoán không chỉ những người gặp phải câu hỏi này. Hiện tại, đây là lần truy cập đầu tiên trên google cho cụm từ tìm kiếm, từ không gian biểu thức chính quy .


3
nó cho phép chuỗi rỗng
Neha Choudhary

1
Wow, thật đơn giản! cảm ơn. Không phải là có một trang web hoặc một cái gì đó mà người ta có thể sử dụng để tạo các biểu thức regex, đối với các noobs, ý tôi là ...
Pierre

1
@Pierre - Khá khó khăn để thực hiện các hướng dẫn của con người và chuyển đổi chúng thành các quy tắc rõ ràng. (Ngôn ngữ của con người là chất lỏng và đầy sự mơ hồ, và bộ não của chúng ta làm hầu hết các công việc cần thiết để giải quyết mọi thứ và lấp đầy các khoảng trống. Máy tính không có bộ não như vậy và những nỗ lực thông minh để bắt chước một thứ vẫn chưa đủ mạnh. ) Có các công cụ tồn tại như debuggex.com đại diện cho regex của bạn một cách trực quan, nhưng nó hấp dẫn vì nó có thể không hữu ích cho người mới bắt đầu hoàn thành. Tuy nhiên, tôi khuyên bạn nên một hướng dẫn tương tác để có được những điều cơ bản.
Andrew Cheong

1
Vâng, cũng regex của bạn sẽ phù hợp nếu chỉ có không gian. Câu trả lời của tôi là bình luận của Neha choudary.
Rajshekar Reddy

1
@Pierre Ba năm sau - Hôm nay tôi bắt gặp câu hỏi này, thấy bình luận của bạn; Tôi sử dụng regex hero ( regexhero.net ) để kiểm tra các biểu thức chính quy. Tôi nghĩ rằng phiên bản trực tuyến chỉ hoạt động trong Internet Explorer với Silverlight nhưng tốt hơn là không có gì.
Michael Armes

120

Một khả năng là chỉ cần thêm khoảng trắng vào lớp ký tự của bạn, như acheong87 đã đề xuất, điều này phụ thuộc vào mức độ nghiêm ngặt của bạn đối với mẫu của bạn, bởi vì điều này cũng sẽ cho phép một chuỗi bắt đầu bằng 5 khoảng trắng hoặc chuỗi chỉ bao gồm các khoảng trắng.

Khả năng khác là xác định một mẫu:

Tôi sẽ sử dụng \wđiều này trong hầu hết các hương vị regex giống như [a-zA-Z0-9_](trong một số nó dựa trên Unicode)

^\w+( \w+)*$

Điều này sẽ cho phép một loạt ít nhất một từ và các từ được chia cho khoảng trắng.

^ Khớp với phần đầu của chuỗi

\w+ Nối một chuỗi ít nhất một ký tự từ

( \w+)*là một nhóm được lặp lại 0 lần trở lên. Trong nhóm, nó mong đợi một không gian theo sau là một chuỗi ít nhất một ký tự từ

$ khớp với phần cuối của chuỗi


Điều này: regex101.com/#javascript cũng cung cấp một lời giải thích tốt cho mẫu biểu thức chính mà bạn muốn phân tích.
Sao đen1

Regex đẹp, đơn giản hơn rất nhiều [0-9a-z], v.v.
George


11

Hãy thử với:

^(\w+ ?)*$

Giải trình:

\w             - alias for [a-zA-Z_0-9]
"whitespace"?  - allow whitespace after word, set is as optional

2
Điều này là để gây ra địa ngục quay trở lại.
nhahtdh

1
Ví dụ: được cung cấp một chuỗi không khớp ggggggggggggggggggggggggggggggggggggg;, regex của bạn sẽ mất rất nhiều thời gian để đạt được kết quả do quay lui quá mức.
nhahtdh

Ok, vậy bạn đề nghị gì?
hsz 18/03/13

7

Tôi giả sử bạn không muốn không gian hàng đầu / dấu. Điều này có nghĩa là bạn phải chia regex thành "ký tự đầu tiên", "thứ ở giữa" và "ký tự cuối":

^[a-zA-Z0-9_][a-zA-Z0-9_ ]*[a-zA-Z0-9_]$

hoặc nếu bạn sử dụng cú pháp giống như perl:

^\w[\w ]*\w$

Ngoài ra: Nếu bạn cố ý nói regex của mình rằng nó cũng cho phép các chuỗi rỗng, bạn phải làm cho toàn bộ tùy chọn:

^(\w[\w ]*\w)?$

Nếu bạn muốn chỉ cho phép các ký tự không gian duy nhất, nó trông hơi khác một chút:

^((\w+ )*\w+)?$

Điều này khớp với 0..n từ theo sau bởi một khoảng trắng, cộng với một từ không có khoảng trắng. Và làm cho toàn bộ điều tùy chọn để cho phép chuỗi trống.


Không gian và \skhông tương đương. \skhông chỉ phù hợp với không gian
nhahtdh

@nhahtdh: Cảm ơn bạn đã bình luận. Tôi đã quá quen với việc kết hợp khoảng trắng nói chung tôi đoán .. Câu trả lời là cố định.
creinig 18/03/13

Có thể là bạn đang thiếu dấu ngoặc đơn đóng) trong biểu thức đầu tiên? Tôi không chắc là tôi đã không thử nó.
ssinfod

@ssinfod: Bắt tốt. Trên thực tế, dấu ngoặc đơn mở là không cần thiết trong ví dụ đó. Cảm ơn.
creinig

3

Biểu thức chính quy này

^\w+(\s\w+)*$

sẽ chỉ cho phép một khoảng trắng duy nhất giữa các từ và không có khoảng trắng ở đầu hoặc cuối.

Dưới đây là giải thích của biểu thức chính quy:

  1. ^ Khẳng định vị trí khi bắt đầu chuỗi
  2. \w+ Nối bất kỳ ký tự từ nào [a-zA-Z0-9_]
    1. Bộ định lượng: +Giữa một lần và không giới hạn, càng nhiều lần càng tốt, trả lại khi cần [tham lam]
  3. Nhóm chụp đầu tiên (\s\w+)*
    1. Bộ định lượng: *Giữa số không và số lần không giới hạn, càng nhiều lần càng tốt, trả lại khi cần [tham lam]
    2. \s Phù hợp với bất kỳ nhân vật khoảng trắng [\r\n\t\f ]
    3. \w+ Nối bất kỳ ký tự từ nào [a-zA-Z0-9_]
      1. Bộ định lượng: +Giữa một lần và không giới hạn, càng nhiều lần càng tốt, trả lại khi cần [tham lam]
  4. $ Khẳng định vị trí ở cuối chuỗi

2

Điều này không cho phép không gian trong đầu. Nhưng cho phép không gian ở giữa các từ. Cũng cho phép các ký tự đặc biệt giữa các từ. Một regex tốt cho các trường FirstName và LastName.

\w+.*$

Câu trả lời này không chính xác / không chính xác. Mẫu này khớp với một hoặc nhiều chữ số, dấu gạch dưới, sau đó bằng 0 hoặc nhiều ký tự không phải dòng mới. Không tốt cho OP.
mickmackusa

2

Chỉ dành cho bảng chữ cái:

^([a-zA-Z])+(\s)+[a-zA-Z]+$

Đối với giá trị chữ và số và _:

^(\w)+(\s)+\w+$

1
nó không phải là ví dụ tốt, bởi vì (cái gì đó) + không giống với (cái gì đó +). Trong ví dụ đầu tiên, chỉ một ký tự sẽ được bắt là $ 1.
Znik

0

Hãy thử điều này: (phiên bản Python)

"(A-Za-z0-9 ){2, 25}"

thay đổi giới hạn trên dựa trên tập dữ liệu của bạn


0

Chỉ cần thêm một khoảng trắng vào cuối mẫu regex của bạn như sau:

[a-zA-Z0-9_ ]

-1

Có một cái nhìn tốt về nhiều câu trả lời được cho là ...

... và bupkis sau khi quét Stack Overflow cũng như các trang web khác cho regex khớp với bất kỳ chuỗi nào không có khoảng trắng bắt đầu hoặc dấu và chỉ có một khoảng trắng giữa các từ ký tự alpha nghiêm ngặt.

^[a-zA-Z]+[(?<=\d\s]([a-zA-Z]+\s)*[a-zA-Z]+$

Do đó dễ dàng sửa đổi thành chữ và số:

^[a-zA-Z0-9]+[(?<=\d\s]([a-zA-Z0-9]+\s)*[a-zA-Z0-9]+$

(Điều này không khớp với các từ đơn lẻ mà chỉ sử dụng một công tắc / if-other với một từ đơn giản ^[a-zA-Z0-9]+$nếu bạn cần thêm các từ đơn lẻ.)

thưởng thức: D


3
[(?<=\d\s]phù hợp với một nhân vật: (, ?, <, =, một chữ số, hoặc một ký tự khoảng trắng, và đó không thể là những gì bạn có nghĩa là. Nếu nó được coi là một cái nhìn, thì nó nên (?<=\d\s), nhưng nó không có ý nghĩa gì ở đó; regex sẽ không bao giờ phù hợp.
Alan Moore

Tovoters: Xin đừng upvote giải pháp sai. Họ nhầm lẫn những người dùng khác và khiến họ tin rằng regex có thể làm những việc không được.
Wiktor Stribiżew


-4

thử .*? để cho phép khoảng trắng nó làm việc cho tôi


Đó là bởi vì .phù hợp với tất cả mọi thứ. Điều này rất có thể không phải là giải pháp ở đây.
rubik

nó khớp với 0 hoặc bất kỳ ký tự nào, phụ thuộc vào những gì trước và sau chuỗi này. Điều này sẽ phù hợp với càng ít càng tốt. dấu chấm đơn đại diện cho bất kỳ ký tự đơn.
Znik
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.