Синтаксический анализ строк в Java

#java

#java — язык #java

Вопрос:

Я пытаюсь разобрать строку примерно так:

Введите «20:00» — на выходе будет «20», Введите «02: 30» — на выходе будет «2», Введите «00: 30» — на выходе будет «».

Вот как я написал, мне не нравится, как я это делаю, поиск более эффективного способа сделать это может заключаться в одном сканировании. Есть идеи?

 private String getString(final String inputString)
{
    String inputString = "20:00"; // This is just for example       
    final String[] splittedString = inputString.split(":");
    final String firstString = splittedString[0];
    int i;
    for (i = 0; i < firstString.length(); i  )
    {
        if (firstString.charAt(i) != '0')
        {
            break;
        }
    }

    String outputString = "";
    if (i != firstString.length())
    {
        outputString = firstString.substring(i, firstString.length());
    }

    return outputString;
}
  

Ответ №1:

 final String firstString = splittedString[0];
int value = Integer.parseInt(firstString);
return value == 0 ? "" : Integer.toString(value);
  

Комментарии:

1. String v = Integer.toString( Integer.parseInt( input.split(":")[0] ) ); return v.equals("0") ? "" : v;

2. что такое, я также хочу разрешить пробелы «2: 30» во входных данных. Я полагаю, что в таком сценарии Interger.parseInt взорвется.

3. @Rishi попробуйте передать FirstString.trim() в parseInt()

Ответ №2:

Вы могли бы использовать java.util.Scanner . Предполагая, что ваши данные всегда отформатированы dd:dd , вы могли бы сделать что-то вроде этого.

 Scanner s = new Scanner(input).useDelimiter(":");
int n = s.nextInt();
if (n == 0 ) {
  return "";
} else {
  return Integer.toString(n)
}
  

Таким образом, вам не нужно сканировать строку дважды — один раз для разделения и один раз для проверки первого разделения. И, если ваши данные более сложные, вы можете сделать свой сканер более сложным, используя регулярные выражения или что-то в этом роде.