Java Regex Parse - PullRequest
       4

Java Regex Parse

0 голосов
/ 26 апреля 2018

Спасибо за проверку моего вопроса.

Здесь пользователь вводит строку в формате: «xD xS xP xH». Программа берет строку, разбивает ее на пробел, а затем использует регулярное выражение для анализа строки. Есть проблема с моим "окончательным регулярным выражением строки", и я не уверен, где.

final String regex = "([0-9]+)[D|d]| ([0-9]+)[S|s]| ([0-9]+)[P|p]| ([0-9]+)[H|h]";

Наконец, цикл выводит только значение для D, поэтому я подозреваю, что он достигает ошибки, перемещаясь в соответствии с S или s.

public class parseStack
{
   public parseStack()
   {
      System.out.print('\u000c');
      String CurrencyFormat = "xD xS xP xH";
      System.out.println("Please enter currency in the following format: \""+CurrencyFormat+"\" where x is any integer");

       Scanner scan = new Scanner(System.in);
       String currencyIn = scan.nextLine();
       currencyFinal = currencyIn.toUpperCase();
       System.out.println("This is the currency you entered: "+currencyFinal);

       String[] tokens = currencyFinal.split(" ");
       final String input = tokens[0];
       final String regex = "([0-9]+)[D|d]| ([0-9]+)[S|s]| ([0-9]+)[P|p]| ([0-9]+)[H|h]";

       if (input.matches(regex) == false) {
           throw new IllegalArgumentException("Input is malformed.");            
       }

        long[] values = Arrays.stream(input.replaceAll(regex, "$1 $2 $3 $4").split(" "))
                .mapToLong(Long::parseLong)
                .toArray();

      for (int i=0; i<values.length; i++)
      {
        System.out.println("value of i: "+i+ "    |" +values[i]+ "|");
      }

    //pause to print
    System.out.println("Please press enter to continue . . . ");
    Scanner itScan = new Scanner(System.in);
    String nextIt = itScan.nextLine();    
 }
}

Ответы [ 3 ]

0 голосов
/ 26 апреля 2018

Ваше регулярное выражение может быть несколько упрощено.

"(?i)(\d+d) (\d+s) (\d+p) (\d+h)"

выполнит сравнение без учета регистра для нескольких цифр (\ d +)

Это может быть дополнительно упрощено до

"(?i)(\d+[dsph])"

, который будет итеративно соответствовать различным группам в строке валюты.

0 голосов
/ 26 апреля 2018

Прежде всего, ваше регулярное выражение выглядит немного сложным. Вы вводите формат "xD xS xP xH" , также вы конвертируете ввод в верхний регистр currencyIn = currencyIn.toUpperCase();, но это не проблема.

Проблема в

String[] tokens = currencyIn.split(" ");
final String input = tokens[0];

Вы разделяете ввод и используете только первую часть, которая будет "xD"

Фиксированный код будет выглядеть так:

String currencyIn = scan.nextLine();
currencyIn = currencyIn.toUpperCase();
System.out.println("This is the currency you entered: "+currencyIn);

final String regex = "([0-9]+)D ([0-9]+)S ([0-9]+)P ([0-9]+)H";

if (!currencyIn.matches(regex)) {
    throw new IllegalArgumentException("Input is malformed.");
}

long[] values = Arrays.stream(currencyIn.replaceAll(regex, "$1 $2 $3 $4").split(" "))
    .mapToLong(Long::parseLong)
    .toArray();

for (int i=0; i<values.length; i++) {
    System.out.println("value of i: "+i+ "    |" +values[i]+ "|");
}
0 голосов
/ 26 апреля 2018

Ваше регулярное выражение должно быть [\d]+[DdSsPpHh].

Проблема, с которой вы столкнулись, состоит в том, что вы разбили строку на куски, а затем сопоставили куски с RegEx, совпадающим с исходной строкой, которую вы разбили.

ОДНАКО этот ответ устраняет только проблему в вашем коде. Ваша рутина, кажется, не отвечает вашим ожиданиям. И ваши ожидания совсем не ясны.

EDIT

Добавлено требование многозначности.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...