Нужно регулярное выражение для проверки пользовательского ввода - PullRequest
0 голосов
/ 25 июня 2018

У меня есть вход, который нужно проверить, и я искал способ использовать регулярные выражения для этого.

Синтаксис ввода

add passenger general {passenger-name} add passenger airline 
{passenger-name} add passenger loyalty {passenger-name} {current- 
loyalty-points} {using-loyalty-points} {has-extra-bag}

Ввод

add passenger airline Trevor add passenger general Mark add passenger 
loyalty Joan 100 FALSE TRUE add passenger general Daniel

Несколько баллов

  • Во входных данных может быть любое количество добавляемых выписок о пассажирах
  • Пассажиры 3-х типов: генерал или авиакомпания или лояльность
  • Для пассажиров общего назначения это будет добавить пассажира генеральной марки
  • Для пассажиров авиакомпании это будет добавить пассажира авиакомпании Тревор
  • Для пассажиров лояльности это будет добавить лояльности пассажиров Джоан 100 ЛОЖНОЕ ИСТИНА

Я пробовал приведенную ниже логику, но она не подтверждает многократное вхождение предложений. Подобно тому, как он проверяет первое вхождение добавленного пассажира общего назначения, но не будет влиять на любое последующее добавление пассажира общего назначения. Аналогично для любого другого типа пассажиров

String s = "add passenger general Mohit add passenger general ra add 
passenger airline rajui";

Pattern pattern = Pattern.compile("((add passenger general) \\D+)* 
((add passenger airline) \\D+)*");

Matcher matcher = pattern.matcher(s);
System.out.println(matcher.matches());

Ответы [ 2 ]

0 голосов
/ 25 июня 2018

Вот регулярное выражение, которое будет проверять всю входную строку, или,
если группа внешних кластеров удалена, вы можете получить отдельные add passanger
типы.Типы указываются в зависимости от того, совпадают ли группы захвата 1, 2 или 3, и
- это имя .

"(?i)^(?:\\s*add\\s+passenger\\s+(?:general\\s+(\\w+)|airline\\s+(\\w+)|loyalty\\s+(\\w+)\\s+(\\d+)\\s+(TRUE|FALSE)\\s+(TRUE|FALSE)))+\\s*$"

Версия для чтения

 (?i)
 ^    
 (?:
      \s* add \s+ passenger \s+ 
      (?:
           general \s+ 
           ( \w+ )                       # (1)

        |  airline \s+ 
           ( \w+ )                       # (2)

        |  loyalty \s+ 
           ( \w+ )                       # (3)
           \s+ 
           ( \d+ )                       # (4)
           \s+ 
           ( TRUE | FALSE )              # (5)
           \s+ 
           ( TRUE | FALSE )              # (6)
      )
 )+
 \s* 
 $

Выход

 **  Grp 0 -  ( pos 0 : len 128 ) 
add passenger airline Trevor add passenger general Mark add passenger 
loyalty Joan 100 FALSE TRUE add passenger general Daniel  
0 голосов
/ 25 июня 2018

Это не ответ на ваш вопрос; скорее, это некоторый совет. Да, было бы возможно создать одно или несколько регулярных выражений для анализа вашего ввода. Однако, учитывая все требования, это будет довольно сложным. После того, как оно было написано, любое изменение ваших входных данных потребует изменения этих регулярных выражений.

Во-первых, я предлагаю, если возможно, изменить ваш ввод. Что-то вроде JSON было бы намного проще создавать и анализировать.

Во-вторых, иногда легче начать с начала вашей строки и разбить ее, используя String.indexOf (), .substring () и т. Д. Это позволяет вам управлять логикой в ​​более понятном виде.

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