从上次迭代中拆分字符串



这篇文章是对这篇文章的更新:使用正则表达式获取字符串中的特定字符并删除未使用的零

首先,我想用正则表达式删除上一场比赛中未使用的零。

我发现正则表达式对于我需要的东西来说有点矫枉过正。


这是我现在想要的,

我想使用split()方法

从中得到:

String myString = "2020-LI50532-3329-00100"

这:

String data1 = "2020"
String data2 = "LI50532"
String data3 = "3329"
String data4 = "00100"

因此,我可以从最后一个data未使用的零中删除

将"00100"转换为"100">

然后连接所有数据以获得此数据

"2020-LI50532-3329-100"

我不熟悉拆分方法,如果有人可以启发我这个^^

您可以使用substring方法来摆脱前导零...

String myString = "2020-LI50532-3329-00100";
String[] data = myString.split("-");
data[3] = data[3].substring(2);
StringBuilder sb = new StringBuilder();
sb.append(data[0] + "-" + data[1] + "-" + data[2] + "-" + data[3]);
String result = sb.toString();
System.out.println(result);

假设我们只想删除最后一个块的前导零,也许我们可以:

  1. 提取最后一个块
  2. 将其转换为整数并返回字符串以删除前导零
  3. 将最后一个块替换为在上述步骤中获得的字符串

像这样:

public String removeLeadingZeroesFromLastBlock(String text) {
int indexOfLastDelimiter = text.lastIndexOf('-');
if (indexOfLastDelimiter >= 0) {
String lastBlock = text.substring(indexOfLastDelimiter + 1);
String lastBlockWithoutLeadingZeroes = String.valueOf(Integer.valueOf(lastBlock)); // will throw exception if last block is not an int
return text.substring(0, indexOfLastDelimiter + 1).concat(lastBlockWithoutLeadingZeroes);
}
return text;
}

使用正则表达式的解决方案:

public class Main {
public static void main(String[] args) {
// Test
System.out.println(parse("2020-LI50532-3329-00100"));
System.out.println(parse("2020-LI50532-3329-00001"));
System.out.println(parse("2020-LI50532-03329-00100"));
System.out.println(parse("2020-LI50532-03329-00001"));
}
static String parse(String str) {
return str.replaceAll("0+(?=[1-9]\d*$)", "");
}
}

输出:

2020-LI50532-3329-100
2020-LI50532-3329-1
2020-LI50532-03329-100
2020-LI50532-03329-1

正则表达式的解释:

一个或多个零后跟一个非零数字,可以选择后跟任何数字,直到字符串的末尾(由$指定)。

不使用正则表达式的解决方案:

您也可以通过使用Integer.parseInt来做到这一点,它可以将像00100这样的字符串解析为100

public class Main {
public static void main(String[] args) {
// Test
System.out.println(parse("2020-LI50532-3329-00100"));
System.out.println(parse("2020-LI50532-3329-00001"));
System.out.println(parse("2020-LI50532-03329-00100"));
System.out.println(parse("2020-LI50532-03329-00001"));
}
static String parse(String str) {
String[] parts = str.split("-");
try {
parts[parts.length - 1] = String.valueOf(Integer.parseInt(parts[parts.length - 1]));
} catch (NumberFormatException e) {
// Do nothing
}
return String.join("-", parts);
}
}

输出:

2020-LI50532-3329-100
2020-LI50532-3329-1
2020-LI50532-03329-100
2020-LI50532-03329-1

您可以将最后一个字符串部分转换为整数类型,如下所示以删除未使用的零:

String myString = "2020-LI50532-3329-00100";
String[] data = myString.split("-");
data[3] = data[3].substring(2);
StringBuilder sb = new StringBuilder();
sb.append(data[0] + "-" + data[1] + "-" + data[2] + "-" + Integer.parseInt(data[3]));
String result = sb.toString();
System.out.println(result);

应尽可能避免字符串操作,并依赖 Java 语言中的现有类型。一种这样的类型是整数。看起来您的代码由 4 部分组成 - 年份(整数) - 字符串 - 整数 - 整数。

因此,为了正确验证它,我将使用以下代码:

Scanner scan = new Scanner("2020-LI50532-3329-00100");
scan.useDelimiter("-");
Integer firstPart = scan.nextInt();
String secondPart = scan.next();
Integer thirdPart = scan.nextInt();
Integer fourthPart = scan.nextInt();

或者像这样:

String str = "00100";
int num = Integer.parseInt(str);
System.out.println(num);

如果要重建原始值,则可能应该使用 NumberFormat 添加缺少的 0。

要点是:

  • 始终尝试重用您的语言中可用的现有代码和工具
  • 始终尝试使用可用类型(本地日期、整数、长整型)
  • 创建自己的类型(类)并使用面向对象语言的表现力
public class Test {
public static void main(String[] args) {
System.out.println(trimLeadingZeroesFromLastPart("2020-LI50532-03329-00100"));
}
private static String trimLeadingZeroesFromLastPart(String input) {
String delem = "-";
String result = "";
if (input != null && !input.isEmpty()) {
String[] data = input.split(delem);
StringBuilder tempStrBldr = new StringBuilder();
for (int idx = 0; idx < data.length; idx++) {
if (idx == data.length - 1) {
tempStrBldr.append(trimLeadingZeroes(data[idx]));
} else {
tempStrBldr.append(data[idx]);
}
tempStrBldr.append(delem);
}
result = tempStrBldr.substring(0, tempStrBldr.length() - 1);
}
return result;
}
private static String trimLeadingZeroes(String input) {
int idx;
for (idx = 0; idx < input.length() - 1; idx++) {
if (input.charAt(idx) != '0') {
break;
}
}
return input.substring(idx);
}
}

输出:

2020-LI50532-3329-100

最新更新