2012-11-22 57 views
8

我試圖匹配由多個空格分隔的文件。我遇到的問題是第一個字段可以包含一個空格。我怎樣才能將它與正則表達式匹配?單個空間的正則表達式

如:

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

我可以用空格分割這些行成三個字段與一個正則表達式,分裂,但允許在第一場單空間?

+1

你使用什麼語言? – garyh

+4

你不一定需要一個正則表達式。由於它們被空格分隔,所以您可以一次只讀15個字符以獲取每列,然後去掉空白以獲取數據。 –

回答

6

嗨以下的正則表達式應該工作

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

你的回答讓我知道正確的正則表達式,謝謝。我使用的最後一個正則表達式是(。*?)[] {2,}(。*?)[] {2,}(。*?)[] {2,}(。*?)[] { }(。*?)[] {2,}(。*?)[] {2,}(。*?)$' – Echilon

+0

您好@Echilon,tnx反饋,很高興我可以幫助我的最小正則表達式knownlegde: ) –

2

你可以在兩個或多個空格分開:

[ ]{2,} 

但你可能會更好過,確定這個正則表達式的捕獲的長度:

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

然後使用一個簡單的子字符串方法切片你的線分成相同長度的部分。

所以在你的情況下,第一次捕獲將是15個字符長,第二個14和列將有13個(但最後一個並不重要,這就是爲什麼它實際上沒有捕獲)。然後你將每一行的前15位,後14位和其餘字符以及trim(刪除尾隨空格)。

0

通常,對於這類文件,最好的方法是根據所需信息的位置獲取子字符串,然後對其進行修剪。我看到你的文件在第二個字段之前包含16個字符,你可以從頭開始獲得長度爲16的子字符串,它將包含你想要的文本。你應該修剪它,以獲得沒有空格的文本。

如果你發佈的間隔模式是一致的(如果它不會在這種不同的文件中改變),你還有另外一個問題:長名稱會發生​​什麼?

Name   Other Data 
Johnny AppleseeXX1 
TutankamonfirstXX2 

如果你真的想使用正則表達式,一定要避免這些角落案例。

3

這會工作:

模式:

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

更換:

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

$1包含第一列,$2第二和$3第三個。

例子: http://regexr.com?32tbt

0

我認爲最簡單的是使用兩個或兩個以上的空間相匹配的正則表達式。

/ +/ 

其中...(/)後跟一個空格(),後跟另一個空格一次或多次( +),後跟結束分隔符(本例中爲/,但是語言特定)。

所以簡單地說,使用正則表達式來匹配空間,然後使用一個或多個空格作爲分割字符串的手段。

+0

'/'不是正則表達式的一部分,僅用作一定數量語言的分隔符。此外,爲了便於閱讀,我強烈建議將每個文字空間作爲'[]'寫在正則表達式中。 –