2012-11-22 26 views
8

Tôi đang cố gắng khớp một tệp được phân tách bằng nhiều dấu cách. Vấn đề tôi có là trường đầu tiên có thể chứa một không gian duy nhất. Làm thế nào tôi có thể kết hợp điều này với một regex?Regex cho không gian đơn

Ví dụ:

Name   Other Data Other Data 2 
Bob Smith  XX1   0101010101 
John Doe  XX2   0101010101 
Bob Doe  XX3   0101010101 
John Smith  XX4   0101010101 

Tôi có thể chia những dòng này thành ba lĩnh vực với một regex, chia tách bởi một không gian nhưng cho phép không gian duy nhất trong lĩnh vực đầu tiên?

+1

bạn đang sử dụng ngôn ngữ nào? – garyh

+4

Bạn không nhất thiết cần một regex. Vì chúng được phân cách bằng dấu cách, bạn chỉ có thể đọc 15 ký tự cùng một lúc để lấy từng cột và sau đó loại bỏ khoảng trắng để lấy dữ liệu. –

Trả lời

6

Hi regex sau đây nên làm việc

(\w*\s\w*)\s+\w{2}\d\s+\d* 
+1

Câu trả lời của bạn đã dẫn tôi đến đúng regex, cảm ơn. Regex cuối cùng tôi đã sử dụng là '(. *?) [] {2,} (. *?) [] {2,} (. *?) [] {2,} (. *?) [] {2, } (. *?) [] {2,} (. *?) [] {2,} (. *?) $ ' – Echilon

+0

Xin chào @Echilon, tnx cho thông tin phản hồi, vui vì tôi có thể trợ giúp với regex tối thiểu được biết đến của tôi:) –

2

Bạn có thể chia ở hai hay nhiều không gian:

[ ]{2,} 

Nhưng bạn có lẽ tốt hơn, xác định độ dài của ảnh chụp của biểu thức chính quy này :

(Name[ ]+)(Other Data[ ]+) 

Và sau đó sử dụng phương pháp chuỗi con đơn giản để lát các đường của bạn thành các phần có cùng độ dài.

Vì vậy, trong trường hợp của bạn, lần chụp đầu tiên sẽ dài 15 ký tự, cột thứ hai và cột sẽ có 13 (nhưng chữ cuối cùng không thực sự quan trọng, đó là lý do tại sao nó không thực sự bị bắt). Sau đó, bạn lấy 15 đầu tiên, 14 ký tự tiếp theo và các ký tự còn lại của mỗi dòng và trim mỗi ký tự (loại bỏ khoảng trống cuối).

0

Thông thường, với loại tệp này, cách tiếp cận tốt nhất là nhận chuỗi con dựa trên thông tin bắt buộc của bạn và sau đó cắt thông tin đó. Tôi thấy tệp của bạn chứa 16 ký tự trước trường thứ hai, bạn có thể nhận được chuỗi con có chiều dài 16 từ đầu sẽ chứa văn bản bạn muốn. Bạn nên cắt nó để chỉ nhận được văn bản bạn cần mà không có khoảng trống.

Nếu mẫu khoảng cách bạn đăng nhất quán (nếu nó không thay đổi giữa các tệp khác nhau thuộc loại này), bạn cũng có một vấn đề khác: điều gì xảy ra với tên dài hơn?

Name   Other Data 
Johnny AppleseeXX1 
TutankamonfirstXX2 

nếu bạn thực sự muốn sử dụng regex, hãy đảm bảo tránh những trường hợp góc đó.

3

này sẽ làm việc:

Pattern:

(.*?)[ ]{2,}(.*?)[ ]{2,}(.*) 

thay thế:

+$1+ -$2- *$3* 

$1 chứa cột đầu tiên, $2 thứ hai và $3 một thứ ba.

Ví dụ: http://regexr.com?32tbt

0

Tôi nghĩ đơn giản nhất là sử dụng một regex phù hợp với hai hoặc nhiều khoảng trắng.

/ +/ 

Được phân tích thành ...delimiter (/) theo sau là một dấu cách () theo sau là một dấu cách khác một lần hoặc nhiều hơn ( +) theo sau dấu phân cách cuối (/ trong ví dụ của tôi, nhưng là ngôn ngữ cụ thể).

Vì vậy, chỉ cần đặt, sử dụng regex để khớp không gian, sau đó một hoặc nhiều khoảng trống làm phương tiện để tách chuỗi của bạn.

+0

'/' không phải là một phần của regex và chỉ được sử dụng làm dấu phân cách bằng một số ngôn ngữ nhất định. Ngoài ra, để dễ đọc, tôi rất khuyên bạn nên viết mỗi không gian theo chữ trong một regex là '[]'. –

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