[英]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.