根据各个字段的长度拆分字符串

时间:2017-03-05 06:44:07

标签: java regex string

我正在尝试解析文本文件并从中获取变量。这是我用于将数据转换为字符串的代码。

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

有没有办法写一个正则表达式模式来分割字符串?我确实搜索了这个可变长度分割,但无法找到任何。

如果无法进行模式拆分,我必须编写代码以完成循环检查字段名称,值的长度并使用索引进行拆分。

3 个答案:

答案 0 :(得分: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

答案 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或我们有行尾。

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