子串长度不一致

时间:2018-11-27 11:32:47

标签: javascript

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

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


示例1

  

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


示例2

  

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

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

2 个答案:

答案 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