我有一个很长的字符串,其中包含多个信息。因此,我想我们可以说它的两个字段串联在一起而没有任何定界符。我知道,要使这项工作有效,所有字段的长度应始终固定。但是,两个字段代表一个名称和一个数量,并且没有实现前缀/后缀来保持固定长度。
我想知道如何解决这个问题?这是字符串的示例,以及如何分隔它们:
样品#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]+)
的内容可能会有所改进,因为这至少会在名称中间允许使用数字。有时,您只需要接受以下事实,那就是,当给您的数据是废话时,您必须尽力而为,这可能意味着将其中的一些信息丢弃掉。