繁体   English   中英

使用正则表达式格式化值和多个零

[英]Format the Value and multiple zeros using Regex

这是我在这个最大的社区中学到的很多知识,这是我的第一个问题。

我的要求是:
假设用户输入EK1则输出应为EK1 EK01 EK001 EK0001
如果输入为EK23 ,则输出: EK23 EK023 EK0023
如果输入为EK876 ,则输出: EK876 EK0876
如果输入为EK0002 ,则输出: EK0002
如果输入为MUSDG EK768 tygft则输出应为MUSDG EK768 EK0768 tygft

这意味着无论用户输入什么输入,输出应该匹配2个字母和至少一位数字。
然后它应该开始加零。
如果不匹配,则应返回与输入相同的值。

我已经在下面的代码中尝试过了,但是它在某一时刻失败了。
如果数字只有一个,例如EK1 ,则它给出EK1 EK01 EK001
但是应该给EK1 EK01 EK001 EK0001
也就是说,当前输出缺少最后一个组合。

请参考下面的代码,看看我做错了什么。
请修改以下代码或给我建议。

package com.abc.common.customersearch.repository.test;
import java.util.regex.Matcher;
import java.util.regex.Pattern;

public class Test1 {
    private static final Pattern zeroPattern = Pattern.compile("[0]");
    private static final String TOKEN_PATTERN = "[a-zA-Z]{2}[0-9]";
    private static final String ONE = "{1}";
    private static final String TWO = "{2}";
    private static final String THREE = "{3}";
    private static final String FOUR = "{4}";

    public static void main(String as[]) {

        String inputToken = null;
        String outputStr = null;

        inputToken ="EK001";
        outputStr = flightToken(inputToken);
        System.out.println("["+inputToken+"] >> ["+outputStr+"]");

        inputToken = "MUS EK874";
        outputStr = flightToken(inputToken);
        System.out.println("["+inputToken+"] >> ["+outputStr+"]");

        inputToken ="EK08";
        outputStr = flightToken(inputToken);
        System.out.println("["+inputToken+"] >> ["+outputStr+"]");

        inputToken ="MUS EK1"; // This is failing
        outputStr = flightToken(inputToken);
        System.out.println("["+inputToken+"] >> ["+outputStr+"]");

        inputToken ="MUS EK47";
        outputStr = flightToken(inputToken);
        System.out.println("["+inputToken+"] >> ["+outputStr+"]");

        inputToken ="EK0001";
        outputStr = flightToken(inputToken);
        System.out.println("["+inputToken+"] >> ["+outputStr+"]");

        inputToken ="E asfddsfsf EF549 dsgffdgfdgfdg";
        outputStr = flightToken(inputToken);
        System.out.println("["+inputToken+"] >> ["+outputStr+"]");

        inputToken ="AB09";
        outputStr = flightToken(inputToken);
        System.out.println("["+inputToken+"] >> ["+outputStr+"]");

        inputToken ="EK7 765kj 34h";
        outputStr = flightToken(inputToken);
        System.out.println("["+inputToken+"] >> ["+outputStr+"]");



    }

    public static String flightToken(String inputToken){

        StringBuilder finalToken = new StringBuilder();
        boolean isValidToken = false;
        for (String token : inputToken.split("\\s")) {
            if (isValidToken(token)) {
                finalToken.append(token).append(" ");
                finalToken.append(getPaddedValue(token)).append(" ");
                isValidToken = true;
            } else {
                finalToken.append(token).append(" ");
            }
        }
        if (isValidToken) {
            //System.out.println("parsed token : " + finalToken.toString());
            return finalToken.toString();
        } else {
            //System.out.println("invalid token : " + inputToken);
            return inputToken;
        }

    }


    private static final String getPaddedValue(String toTest) {
        StringBuilder paddedvalue = new StringBuilder();
        int zeroCounter = countOfAvailableZeroInToken(toTest);
        for (int i = 0; i < 3 - zeroCounter; i++) {
            paddedvalue.append(toTest.substring(0, 2));
            for(int j= 0; j<=i; j++){
                paddedvalue.append("0");
            }
            paddedvalue.append(toTest.split("[a-zA-Z]{2}")[1]).append(" ");
            if(paddedvalue.length()-1>=6){
                break;
            }
        }
        return paddedvalue.toString();
    }


    private static final boolean isValidToken(String pattern) {
        if (pattern.matches(TOKEN_PATTERN + FOUR)
                || pattern.matches(TOKEN_PATTERN + THREE)
                || pattern.matches(TOKEN_PATTERN + TWO)
                || pattern.matches(TOKEN_PATTERN + ONE)) {
            return true;
        } else {
            return false;
        }
    }

    private static final int countOfAvailableZeroInToken(String toTest) {
        int count = 0;
        Matcher zeroMatcher = zeroPattern.matcher(toTest);
        while (zeroMatcher.find()) {
            ++count;
        }
        return count;
    }
}

更改您的getPaddedValue(String ...)

private static final String getPaddedValue(String toTest) {
    StringBuilder paddedvalue = new StringBuilder();
    int zeroCounter = countOfAvailableZeroInToken(toTest);
    for (int i = 0; i < 3 - zeroCounter; i++) {
        StringBuilder currValue = new StringBuilder();
        currValue.append(toTest.substring(0, 2));
        for(int j = 0; j <= i; j++){
            currValue.append("0");
        }
        currValue.append(toTest.split("[a-zA-Z]{2}")[1]).append(" ");

        paddedvalue.append(currValue.toString());

        if(currValue.length() > 6) {
            break;
        }
    }
    return paddedvalue.toString();
}

在循环中使用单独的StringBuilder,并将其用于检查。

输出:

[EK001] >> [EK001 EK0001  ]
[MUS EK874] >> [MUS EK874 EK0874  ]
[EK08] >> [EK08 EK008 EK0008  ]
[MUS EK1] >> [MUS EK1 EK01 EK001 EK0001  ]
[MUS EK47] >> [MUS EK47 EK047 EK0047  ]
[EK0001] >> [EK0001  ]
[E asfddsfsf EF549 dsgffdgfdgfdg] >> [E asfddsfsf EF549 EF0549  dsgffdgfdgfdg ]
[AB09] >> [AB09 AB009 AB0009  ]
[EK7 765kj 34h] >> [EK7 EK07 EK007 EK0007  765kj 34h ]
[EK1 AB2] >> [EK1 EK01 EK001 EK0001  AB2 AB02 AB002 AB0002  ]

更改您的getPaddedValue(String toTest)

每次循环时,您的paddedvalue都会附加一个新值,您需要检查的length()为

EK01

EK001

EK0001

EK1 EK01 EK001 EK0001

因此,pappedvalue的长度在第二个循环中将大于6,然后中断。 这使您得到错误的结果。

您需要获取每个子字符串,并检查长度小于6

private static final String getPaddedValue(String toTest) {
    StringBuilder paddedvalue = new StringBuilder();
    int zeroCounter = countOfAvailableZeroInToken(toTest);
    for (int i = 0; i < 3 - zeroCounter; i++) {
        paddedvalue.append(toTest.substring(0, 2));
        for(int j= 0; j<=i; j++){
            paddedvalue.append("0");
        }
        paddedvalue.append(toTest.split("[a-zA-Z]{2}")[1]).append(" ");

        //change your if condition like this
        String lastPaddedValue = paddedvalue.toString().split("\\s")[paddedvalue.toString().split("\\s").length - 1];
        if(lastPaddedValue.length()-1>=6){
            break;
        }
    }
    return paddedvalue.toString();
}

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM