我有一个很长的字符串,其中包含多个信息。因此,我想我们可以说它的两个字段串联在一起而没有任何定界符。我知道,要使这项工作有效,所有字段的长度应始终固定。但是,两个字段代表一个名称和一个数量,并且没有实现前缀/后缀来保持固定长度。

我想知道如何解决这个问题?这是字符串的示例,以及如何分隔它们:

样品#1


  实际输入:
  48001MCAbastillas2200800046300017100518110555130000123
  应该如何分离:
  480 | 01 | MCAbastillas | 2200800046300017 | 100518 | 110555 | 130000 | 123


样品#2


  实际输入:
  48004MCAbastillas22008000463000171005181105555000000123
  应该如何分离:
  480 | 04 | MCAbastillas | 2200800046300017 | 100518 | 110555 | 5000000 | 123


在我的示例中,仅金额发生了变化,但我希望名称的长度也会有所不同。任何建议将不胜感激。

最佳答案

我可能为此使用正则表达式。

String test = "48004MCAbastillas22008000463000171005181105555000000123";
Pattern pattern = Pattern.compile("^(\\d{3})(\\d{2})([A-Za-z]+)(\\d{16})(\\d{6})(\\d{6})(\\d+)(\\d{3})$");
Matcher matcher = pattern.matcher(test);
if (matcher.matches())
{
    for (int i = 1; i <= matcher.groupCount(); ++i)
    {
        System.out.print(matcher.group(i) + " | ");
    }
}


样本输出:


  480 | 04 | MCAbastillas | 2200800046300017 | 100518 | 110555 | 5000000
  | 123 |


请注意,第三和倒数第二组没有固定长度。

如果名称可以包含数字,则更加困难。我的方法是对您拥有的数据执行此操作,并打印所有不匹配项的列表(即添加else子句)。也许您可以为处理这些案件提出更好的策略。例如,类似([A-Za-z]+\w*[A-Za-z]+)的内容可能会有所改进,因为这至少会在名称中间允许使用数字。

有时,您只需要接受以下事实,那就是,当给您的数据是废话时,您必须尽力而为,这可能意味着将其中的一些信息丢弃掉。

09-25 15:47