[英]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.