我正在尝试解析文本文件并从中获取变量。这是我用于将数据转换为字符串的代码。
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
有没有办法写一个正则表达式模式来分割字符串?我确实搜索了这个可变长度分割,但无法找到任何。
如果无法进行模式拆分,我必须编写代码以完成循环检查字段名称,值的长度并使用索引进行拆分。
答案 0 :(得分:2)
现在可以使用您编辑过的问题。
使用此正则表达式:
([^\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
答案 1 :(得分:1)
没有正则表达式可以为你正确分割这个字符串。您想要的是伪结构语法中的[a-zA-Z]+(?group1:[0-9]+)[a-zA-Z]{\group1}
。不幸的是,正常的res不会提供这种行为,而且各种扩展(PCRE,re2等)都没有。
事实上,您所描述的语言似乎不是regular。如果您尝试手动构建自动机,则在解析数字部分时,您会发现需要某种内存。我的自动机理论很生疏,但事情可能甚至没有上下文。
另外,请检查您是否有歧义。是position12ab
允许导致position1 : ab
还是错误?
答案 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
或我们有行尾。<强>代码:强>
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));
}