我们可以从 java 中删除不需要的分隔符吗?

Can we remove unwanted delimiters from java

提问人:Darshit ff 提问时间:9/14/2021 最后编辑:Arvind Kumar AvinashDarshit ff 更新时间:9/15/2021 访问量:373

问:

我希望程序接受输入,从该字符串中删除分隔符,然后重新添加它,然后我稍后可以将其解析为一个对象,但我无法做必要的事情。LocalDate

Scanner darshit = new Scanner(System.in);
String oo = "";
System.out.println("Enter your DOB: ");
String dob = darshit.next();
String[] words = dob.split("\\D");
for (int i = 0; i > words.length; i++) {
    oo = oo + words[i];
}
System.out.println(oo);

例如,在将 DOB 输入为 25-06-2008 后,输出应该是 25062008 或 2662008 但而不是这个,我得到一个空行!

Java 日期

评论

8赞 Little Santi 9/14/2021
首先,循环条件是错误的:它应该是 .i < words.length
1赞 Abishek Stephen 9/14/2021
使用 StringBuilder 而不是 +
0赞 bschellekens 9/14/2021
只使用 String.replace() 怎么样?oo = dob.replace(“-”, “”) 将从字符串中删除破折号。
0赞 Abishek Stephen 9/14/2021
不应该是 nextLine() 而不是 next()
2赞 Andy Turner 9/14/2021
您是否创建了其他帐户?

答:

7赞 Arvind Kumar Avinash 9/14/2021 #1

用于将输入字符串解析为所需格式的字符串,然后将其格式化为所需格式的字符串。DateTimeFormatterLocalDateLocalDate

演示:

import java.time.LocalDate;
import java.time.format.DateTimeFormatter;
import java.util.Locale;
import java.util.Scanner;

public class Main {
    public static void main(String[] args) {
        Scanner darshit = new Scanner(System.in);
        System.out.print("Enter your DOB: ");
        String dob = darshit.next();
        DateTimeFormatter dtfInput = DateTimeFormatter.ofPattern("dd[-][/]MM[-][/]uuuu", Locale.ENGLISH);

        LocalDate date = LocalDate.parse(dob, dtfInput);
        // Output in the default format i.e. LocalDate#toString implementation
        // System.out.println(date);

        // Output in a custom format
        DateTimeFormatter dtfOutput = DateTimeFormatter.ofPattern("ddMMuuuu", Locale.ENGLISH);
        String formatted = dtfOutput.format(date);
        System.out.println(formatted);
    }
}

请注意方括号中的可选模式,这是 .DateTimeFormatter

示例运行:

Enter your DOB: 25-06-2008
25062008

另一个示例运行:

Enter your DOB: 25/06/2008
25062008

Trail: Date Time 了解有关现代日期时间 API* 的更多信息。


* 无论出于何种原因,如果你必须坚持使用 Java 6 或 Java 7,你可以使用 ThreeTen-Backport,它将大部分 java.time 功能向后移植到 Java 6 和 7。如果您正在为 Android 项目工作,并且您的 Android API 级别仍然不符合 Java-8,请查看通过脱糖提供的 Java 8+ API如何在 Android 项目中使用 ThreeTenABP

评论

0赞 Darshit ff 9/14/2021
我不能使用,因为它不是固定的,我想从中删除分隔符的输入是 dd-MM-uuuu ,它也可以是 dd/MM/uuuu 。那么有什么东西可以吗?DateTimeFormatter
0赞 Arvind Kumar Avinash 9/14/2021
@Darshitff - 在这种情况下,您应该使用允许您输入 25-06-2008 或 25/06/2008 的模式。如有任何进一步的疑问/问题,请随时发表评论。dd[-][/]MM[-][/]uuuu
0赞 stackoverflow 9/14/2021 #2

您可以将 Java Streams 与 Collectors 加入调用一起使用吗?

String value = Arrays.asList(dob.split("\\D")).stream().collect(Collectors.joining());

评论

0赞 Stephen C 9/15/2021
虽然字符串抨击有点有效,但这不是最好的方法。考虑用户输入其出生日期为 2008-05-07 的情况。或者123456789。
-1赞 Darshit ff 9/15/2021 #3

我自己找到了解决方案

import java.util.Scanner;
import java.time.format.*;
import java.time.*;

public class Main {
  public static void main(String[] args) {
    Scanner scanner = new Scanner(System.in);
    System.out.println("Enter your DOB: ");
    String dateOfBirth = scanner.next();
    String dateOfBirth1 = dateOfBirth.replaceAll("\\s", "");
    String[] dateOfBirthArray = dateOfBirth1.split("[\\s\\-\\.\\'\\?\\,\\_\\@]+");
      int[] dateOfBirthArray1 = new int[dateOfBirthArray.length];
      for (int i = 0; i < dateOfBirthArray.length; i++){
        dateOfBirthArray1[i] = Integer.parseInt(dateOfBirthArray[i]);
      }
      int dayDateOfBirth = dateOfBirthArray1[0] , monthDateOfBirth = dateOfBirthArray1[1];
      int yearDateOfBirth = dateOfBirthArray1[2];
      LocalDate today = LocalDate.now();
      LocalDate birthday = LocalDate.of(yearDateOfBirth, monthDateOfBirth, dayDateOfBirth);
      DateTimeFormatter formatter = DateTimeFormatter.ofPattern("dd-MM-yyyy");
      String birthday1 = birthday.format(formatter);
  }
}

在我看来,这是最简单的方法,公共编辑可以编辑帖子以使其更清晰

评论

0赞 Anonymous 9/15/2021
这是一个非常复杂的方法。请改用 a。DateTimeFormatter
0赞 Darshit ff 9/15/2021
这是最好的方法哈哈,让我试试DateTimeFormatter
1赞 Community 9/15/2021
正如目前所写的那样,你的答案尚不清楚。请编辑以添加其他详细信息,以帮助其他人了解这如何解决所提出的问题。您可以在帮助中心找到有关如何写出好答案的更多信息。
0赞 Stephen C 9/15/2021
对不起,但依靠其他人将您的答案编辑成良好的形状是......不开。特别是因为您的代码采用的方法过于复杂。
1赞 Anonymous 9/15/2021 #4

String.replaceAll() 和 DateTimeFormatter

private static final DateTimeFormatter DATE_PARSER
        = DateTimeFormatter.ofPattern("[-]d-M-u[-]", Locale.ROOT);
private static final DateTimeFormatter DATE_FORMATTER
        = DateTimeFormatter.ofPattern("dd-MM-uuuu", Locale.ROOT);

public static void parseAndFormat(String input) {
    String adapted = input.replaceAll("\\W+", "-");
    System.out.println("Adapted input string: " + adapted);
    LocalDate date = LocalDate.parse(adapted, DATE_PARSER);
    String formatted = date.format(DATE_FORMATTER);
    System.out.println("Formatted:            " + formatted);
}

上面的方法解析你的字符串:

    parseAndFormat("25-06-2008");

输出:

Adapted input string: 25-06-2008
Formatted:            25-06-2008

它非常宽容用户决定在数字之间使用哪些分隔符,以及它们之前或之后(如果有的话):

    parseAndFormat("$5///7  2008 ?");
Adapted input string: -5-7-2008-
Formatted:            05-07-2008

工作原理:用一个连字符替换任何非单词字符(除字母 a 到 z 和数字 0 到 9 之外的所有字符)。没有人有兴趣看到改编后的输入字符串,我只是打印它,以便您更好地理解该过程。我用于解析的格式化程序首先和最后一个接受可选的连字符。格式模式中的方括号表示可选部件。它还接受 1 位或 2 位数字的日和月,以及最多 9 位数字的年份。我使用单独的格式化程序进行格式化,因此我可以控制日期和月份以 2 位数字显示,并且之前和之后都没有连字符。input.replaceAll("\\W+", "-")