2017-03-05 52 views
2

我想解析文本文件並從中獲取變量。這是我用來將數據轉換爲字符串的代碼。根據各個字段的長度拆分字符串

File file = new File(p); 
BfferedReader reader = new BufferedReader(new FileReader(file)); 

while ((line = reader.readLine()) != null) { 
    oldtext += line; 
} 
reader.close(); 

編輯:文件具有固定長度的字段名稱,值的長度, 值。

例如,具有長度10字段名,後跟值的單一的數字長度,然後將值

fieldOne 5abcdefieldTwo 3abcfieldThree6abcdef 

預期輸出是這兩個字段名稱和值存儲爲一個鍵值對

fieldOne : abcde 
fieldTwo : abc 
fieldThree : abcdef 

有沒有辦法寫一個正則表達式模式來分割字符串?我沒有搜索這個可變長度拆分,但找不到任何。

如果模式分裂是不可能的,我必須編寫代碼來檢查循環檢查字段名稱,值的長度和索引拆分。

+2

你將不得不文本 '場' 爲每個字段的前綴? –

回答

1

您可以使用此正則表達式來捕捉現場,長度,價值組合從輸入:

(\w[\w\s]{9})(\d)(.+?(?=\w[\w\s]{9}\d|$)) 
  • (\w[\w\s]{9}) - 匹配的10
  • (\d)準確長度的字段名 - 匹配字段長度
  • (.+?(?=\w[\w\s]{9}\d|$))是一個積極的前瞻,斷言我們有field:len提前或我們有行尾。

RegEx Demo

代碼:

final String regex = "(\\w[\\w\\s]{9})(\\d)(.+?(?=\\w[\\w\\s]{9}\\d|$))"; 
final String string = "fieldOne 5abcdefieldTwo 3abcfieldThree6abcdef"; 

final Pattern pattern = Pattern.compile(regex, Pattern.MULTILINE); 
final Matcher matcher = pattern.matcher(string); 

while (matcher.find()) { 
    System.out.printf("Field: <%s> Len: <%d> Value: <%s>%n", 
      matcher.group(1).trim(), matcher.group(2), matcher.group(3)); 
} 
1

沒有正確的表達式可以正確地爲你分割這個字符串。你想要的就像僞重新語法中的[a-zA-Z]+(?group1:[0-9]+)[a-zA-Z]{\group1}。不幸的是,正常水庫不提供這種行爲,而各種擴展(PCRE,re2等)也不會。

事實上,您所描述的語言似乎不是regular。如果您嘗試手動構建自動機,則在分析數字部分時會發現需要某種內存。我的自動機理論是生鏽的,但這個事情甚至可能沒有上下文。


此外,請檢查您沒有歧義。是否允許像position12ab導致position1 : ab或將它錯誤?

+0

One Correction ...我剛剛編輯了這個問題。字段名稱的長度是不變的。只有值的長度不同。 – Dinesh

2

現在它可以與您編輯的問題。

使用這個表達式:

([^\d]{10})(\d)(.*?) 

Explanation

試試這個:

final String pat = "([^\\d]{10})(\\d)(.*?)"; 
final String string = "fieldOne 5abcdefieldTwo 3abcfieldThree6abcdef"; 

Pattern p = Pattern.compile(pat); 
Matcher m = p.matcher(string);   
String[] val = string.split(pat); 

int cnt=0; 
while(m.find()) 
    System.out.println(m.group(1).trim()+" : "+val[++cnt]); 

Run it

輸出示例:

fieldOne : abcde 
fieldTwo : abc 
fieldThree : abcdef 
相關問題