2012-07-23 44 views
1

我試圖把輸入文件看起來像這樣:模式和匹配:格式化文本文件

SomeElement1 | SomeElementWithDifferentLength2 | SomeElement3 | AnElementI'llIgnore4 | Something5 | Element1 | DifferentLength2 | Element3 | AnElementI'Ignore4 | Element5 |

並將其格式化爲具有特定間距的列。我對Java很陌生,來自C++背景。無論如何,我正在研究與正則表達式建立模式,然後尋找匹配。我不確定在正則表達式中用什麼語法來標識特定字符(管道「|」),以便我可以確定該模式。

這似乎是一個很好的方法,如果是的話,Pattern.compile(「正則表達式語法」)的語法是什麼,我將如何確定與它匹配?

+0

你能成爲一個更具體一點的輸出應該是什麼樣子重新分割? – Keppil 2012-07-23 15:15:10

+0

第一個元素將從位置46開始(前面有45個空格),第二個元素將從位置120開始,第三個元素在160,第四個在162,第五個元素被忽略,然後最後放置一個「*」 177.行的數量並不固定,但我的程序要做的第一件事是確定行數,以便在需要時可以調用整數。 – InSpace 2012-07-23 15:20:33

回答

1

爲什麼不簡單地使用String.split()?例如

String[] res = line.split("\\|"); 

(注意split()方法接受一個正則表達式,所以你要逃避管)。

然後,您可以通過合成陣列迭代,並使用String.format()輸出與填充/格式化等

3

我認爲最簡單的做法是:

  1. 打開每一行與字符串數組.split( 「|」)

  2. 與每一列的長度創建整數數組

  3. 創建一個StringBuilder來保存重新格式化的線

  4. 從第1行遍歷數組,將每個字符串填充到第2行數組中的長度,然後將其附加到StringBuilder。

如果有可能的領域有一個預埋管,因此你必須有某種機制逃避他們,然後,而不是分裂的(),你必須編寫代碼來自己解析列。我想你可以爲它寫一個正則表達式,但我認爲這將比循環查找管道的角色更多的工作。

+1

+1。不過你需要使用String.split(「\\ |」)。 – Keppil 2012-07-23 15:23:54

+0

@Keppil哦,好點,是的,管道是魔法。 – Jay 2012-07-23 15:25:42

0

你可以使用String.split(String regex)方法。

0

如果你可以看到文件的內容作爲一個字符串,那麼你可以做任何操作:

  • 直接替換「|」有一定數量的空格: 「|」 stringContents.replaceAll("\\|", " ")

  • 在分割字符串:stringContents.split("\\|");

記住, 「|」是正則表達式中的一個特殊字符,並且被解釋爲「OR」操作,這就是爲什麼它需要用反斜槓(即兩個反斜槓)進行轉義的原因。

0

不要重新發明輪子。使用Apache Commons Lang並檢查StringUtils。

我假設你想要固定長度的列;該庫提供了leftPad()或rightPad()方法以及一堆其他字符串操作。

簡而言之:

  1. 使用String.split()
  2. 環陣列上,並使用StringUtils