簡體   English   中英

根據各個字段的長度分割字符串

[英]Split a string based on the length of individual fields

我試圖解析一個文本文件並從中獲取變量。 這是我用於將數據轉換為字符串的代碼。

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

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

如果無法進行模式分割,則必須編寫代碼以循環檢查字段名稱,值的長度並使用索引進行分割。

現在,您可以編輯問題。

使用此正則表達式:

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

說明

嘗試這個:

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]);

運行

樣本輸出:

fieldOne : abcde
fieldTwo : abc
fieldThree : abcdef

沒有正則表達式可以為您正確分割此字符串。 您想要的是偽偽語法中的[a-zA-Z]+(?group1:[0-9]+)[a-zA-Z]{\\group1} 不幸的是,普通資源不提供這種行為,並且各種擴展(PCRE,re2等)也不提供。

實際上,您所描述的語言似乎不太正常 如果您嘗試手動構建自動機,則在解析數字部分時會發現需要某種內存。 我的自動機理論是生疏的,但事情可能甚至與上下文無關。


另外,請檢查您是否沒有歧義。 是否允許諸如position12ab這樣的結果產生position1 : ab或它會出錯?

您可以使用此正則表達式從輸入中捕獲字段,長度,值組合:

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

正則演示

碼:

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));
}

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM