Cách tìm kiếm sự xuất hiện của nhiều hơn một khoảng trắng giữa các từ trong một dòng


109

Cách tìm kiếm sự xuất hiện của nhiều hơn một khoảng trắng giữa các từ trong một dòng

1. this is a line containing  2 spaces
2. this is a line containing   3 spaces
3. this is a line containing multiple spaces first  second   three   four

Tất cả những điều trên là phù hợp hợp lệ cho regex này. Tôi nên sử dụng regex nào?


Bạn đang cố gắng kiểm tra các khoảng trống liên tiếp hoặc tất cả các khoảng trắng trong dòng đó?
Sachin Shanbhag

các khoảng trống liên tiếp không phải tất cả các khoảng trắng
Sam

1
Chính xác thì bạn hiểu "giữa các từ" nghĩa là gì? Trong hai ví dụ của bạn, có nhiều khoảng trắng giữa một từ và một chữ số. Còn về dấu câu (ví dụ: bạn có muốn nối nhiều khoảng trắng sau dấu chấm và trước từ tiếp theo)? Còn khoảng trắng trước / sau ký tự cuối cùng trong một dòng thì sao? Bạn có muốn khớp các tab không? Còn những dòng không chứa gì ngoài khoảng trắng thì sao?
Tim Pietzcker

khoảng trắng giữa "chứa và 2", "chứa và 3", "đầu tiên và thứ hai", "thứ hai và thứ ba" ... Có, tôi muốn so khớp các dấu cách sau dấu chấm và trước từ tiếp theo.
Sam

Câu trả lời:


180
[ ]{2,}

SPACE (2 hoặc nhiều hơn)

Bạn cũng có thể kiểm tra xem trước và sau khi các từ khoảng trắng đó theo sau. (không phải khoảng trắng khác như tab hoặc dòng mới)

\w[ ]{2,}\w

giống nhau, nhưng bạn cũng có thể chỉ chọn (chụp) các khoảng trống cho các tác vụ như thay thế

\w([ ]{2,})\w

hoặc thấy rằng trước và sau khoảng trắng có bất kỳ thứ gì, không chỉ các ký tự từ (ngoại trừ khoảng trắng)

[^\s]([ ]{2,})[^\s]

1
\wcó nghĩa là 'các ký tự từ', nghĩa là chữ và số và dấu gạch dưới, nhưng không phải là các ký tự không phải dấu cách khác. Để kiểm tra không có khoảng trắng, hãy sử dụng \S(chữ S viết hoa). Ngoài ra, dòng đầu tiên sẽ chỉ khớp với các dòng chứa hai hoặc nhiều khoảng trắng và không có gì khác.
tdammers 21/09/10

Tôi đã cố gắng phát triển câu hỏi. Tôi hiểu rằng tôi đã bỏ lỡ những gì bạn nói \S, tôi chỉ không muốn dựa vào chữ hoa chữ thường cho chức năng như vậy, nó sẽ dễ đọc hơn.
AlexanderMP

1
Tại sao bạn lại sử dụng neo? Anh ấy đang tìm kiếm các khoảng trống được nhúng ở đâu đó trong các dòng.
Tim Pietzcker

Không có lý do đặc biệt. Lúc đầu, tôi nghĩ rằng tôi cần chúng, vì vậy tôi đã kéo chúng theo suốt quá trình. Trên thực tế, bạn đúng mà tôi đã sai khi sử dụng chúng trong trường hợp này. Tôi sẽ chỉnh sửa câu trả lời của mình ngay lập tức.
AlexanderMP

1
\w[ ]{2,}\wsẽ không khớp word.<2 spaces>more wordshoặc một chuỗi bao gồm hoàn toàn khoảng trắng. [^\s]([ ]{2,})[^\s]\wsẽ thất bại trên dòng bắt đầu bằng khoảng trắng hoặc chuỗi như bla<2 spaces>....
Tim Pietzcker

12

Giải pháp đơn giản:

/\s{2,}/

Điều này khớp với tất cả các lần xuất hiện của một hoặc nhiều ký tự khoảng trắng. Nếu bạn cần đối sánh toàn bộ dòng, nhưng chỉ khi nó chứa hai hoặc nhiều ký tự khoảng trắng liên tiếp:

/^.*\s{2,}.*$/

Nếu các khoảng trắng không cần liên tiếp:

/^(.*\s.*){2,}$/

các .*thường tham lam, có nghĩa là nó sẽ đạt được kết thúc của chuỗi thử nghiệm, và tất cả đó sau, nếu có những nhân vật bắt buộc, sẽ không phù hợp. Thông thường, trong trường hợp này, bạn nên thêm ?, như thế này .*?. Điều đó đã xảy ra với tôi khi sử dụng PCRE của PHP
AlexanderMP

Nó phù hợp. "Tham lam" có nghĩa là nó phù hợp nhất có thể trong khi vẫn khớp với toàn bộ khuôn mẫu. /^.*b.*$/thực tế không khớp "foobar", mặc dù bạn mong đợi tham lam đầu tiên đã .*khớp với toàn bộ chuỗi.
tdammers 21/09/10

9

Regex này chọn tất cả các khoảng trắng, bạn có thể sử dụng nó và thay thế nó bằng một khoảng trắng

\s+

ví dụ trong python

result = re.sub('\s+',' ', data))

4

Tìm kiếm [ ]{2,}. Điều này sẽ tìm thấy hai hoặc nhiều khoảng trắng liền kề ở bất kỳ đâu trong dòng. Nó cũng sẽ khớp với các khoảng trống ở đầu và cuối cũng như các dòng bao gồm hoàn toàn khoảng trắng. Nếu bạn không muốn điều đó, hãy xem câu trả lời của Alexander.

Trên thực tế, bạn có thể bỏ dấu ngoặc, chúng chỉ là để rõ ràng (nếu không thì ký tự khoảng trắng đang được lặp lại sẽ không hiển thị rõ ràng :)).

Vấn đề \s{2,}là nó cũng sẽ khớp với các dòng mới trên tệp Windows (trong đó các dòng mới được ký hiệu bằng CRLFhoặc \r\nđược so khớp bởi \s{2}.

Nếu bạn cũng muốn tìm nhiều tab và khoảng trắng, hãy sử dụng [ \t]{2,}.


more than one space between words in a line. Làm thế nào là [ ]{2,}giữa các từ? Bạn thậm chí đã đọc câu hỏi?
AlexanderMP

Đó là lý do tại sao tôi đề cập đến câu trả lời của bạn trong trường hợp OP thực sự muốn nghiêm khắc như anh ấy đang viết. Có lẽ chúng ta nên hỏi anh ấy.
Tim Pietzcker

2

Đây là giải pháp của tôi

[^0-9A-Z,\n]

Thao tác này sẽ xóa tất cả các chữ số, dấu phẩy và các dòng mới nhưng chọn khoảng trống ở giữa, chẳng hạn như tập dữ liệu của

  • 20171106,16632 ESCG0000018SB
  • 20171107,280 ESCG0000018SB
  • 20171106.70476 ESCG0000018SB
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.