我有一个很长的字符串,其中包含多个信息。因此,我想我们可以说它的两个字段串联在一起而没有任何定界符。我知道,要使这项工作有效,所有字段的长度应始终固定。但是,其中两个字段代表名称和数量,并且没有实现前缀/后缀以保持固定长度。
我想知道如何解决这个问题?这是字符串的示例以及如何分隔它们:
示例1
实际输入:
48001MCAbastillas2200800046300017100518110555130000123
应如何分隔:
480 | 01 | MCAbastillas | 2200800046300017 | 100518 | 110555 | 130000 | 123
示例2
实际输入:
48004MCAbastillas22008000463000171005181105555000000123
应如何分隔:
480 | 04 | MCAbastillas | 2200800046300017 | 100518 | 110555 | 5000000 | 123
在我的示例中,仅金额发生了变化,但我希望名称的长度也会有所不同。任何建议将不胜感激。
答案 0 :(得分:2)
我可能为此使用正则表达式。
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]+)
之类的东西可能会有所改进,因为这至少会在名称中间允许数字。
有时候,您只需要接受以下事实即可:当您收到的数据是垃圾时,您必须尽力而为,这可能意味着将其中的一些信息丢弃。
答案 1 :(得分:0)
我们想要输出
480 | 01 | MCAbastillas | 2200800046300017 | 100518 | 110555 | 130000 | 123
其中字段3和7没有固定长度。 假设我们将字符串存储在字符串var中:
String s="48001MCAbastillas2200800046300017100518110555130000123";
我们可以轻松找到字段1和2:
System.out.println(s.substring(0, 3)); //has 3 digit
System.out.println(s.substring(3, 5)); //has 2 digit
//we can reduce s
s=s.substring(6); //remove char from 0 to 5 included
如果您打System.out.println(s);
,您会发现
CAbastillas2200800046300017100518110555130000123
现在我们有了字符串...我可以推断出它仅由char组成。所以我们必须找到一个数字的第一个出现...我们可以使用一个循环:
int index=-1;
for( int i=0; i<s.length(); i++ ) {
if( Character.isDigit(s.charAt(i))) {
index=i;
System.out.println("There is a number in the position "+ index);
break;
}
}
现在您可以使用以下方式提取姓名:
System.out.println(s.substring(0, index));
并提取其他3个字段(您可以优化此部分...)
System.out.println(s.substring(0, 16));
s=s.substring(16);
System.out.println(s.substring(0, 6));
s=s.substring(6);
System.out.println(s.substring(0, 6));
s=s.substring(6);
最后,您可以将剩余的s分为长度为s.length.3和3的两部分。
System.out.println(s.substring(0, s.length()-3));
System.out.println(s.substring( s.length()-3,s.length()));
您的输出将是:
480
01
位置11有一个数字
CAbastillas
2200800046300017
100518
110555
130000
123