Как проверить, имеет ли строка определенный шаблон, не разбивая ее? - PullRequest
0 голосов
/ 08 ноября 2019

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

Напишите программу, которая определяет, соответствует ли входная строка следующему формату:

Формат: PRODUCT_ID.PRODUCT_CATEGORY-LOCATOR_TYPE[LOCATOR_LOT]

  • PRODUCT_ID = всегда начинается с #, за которым следуют 3 нуля, после которых следует числовое значение, которое может быть от 1 до 7 цифр, в диапазоне 1-9999999
  • PRODUCT_CATEGORY = 1-4прописные буквенные символы
  • LOCATOR_TYPE = один символ X, Y или Z в верхнем регистре
  • LOCATOR_LOT = 1-2 цифры, в диапазоне 1-99

Все остальные символы формата являются литеральными символами

Возвращать true, если оно совпадает, и false в противном случае.

Это объявление функции:

public boolean checkPattern(String s){    
}

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

Вот что я получил за регулярное выражение:

String regex = "#000^([1-9]|[1-9][0-9]|[1-9][0-9][0-9]|[1-9][0-9][0-9][0-9]|[1-9][0-9][0-9][0-9][0-9]|[1-9][0-9][0-9]|[1-9][0-9][0-9])$";

Это то, с чего я начал, ноон настолько длинный и сложный и даже не полный (только проверяет идентификатор продукта), что я делаюНе думаю, что я на правильном пути здесь

Ответы [ 2 ]

1 голос
/ 08 ноября 2019

Вот рабочее регулярное выражение:

#000[1-9]\d{0,6}\.[A-Z]{1,4}\-[XYZ]\[[1-9]\d?\]

А вот разбивка:

#000    # match the literal characters, #000
[1-9]   # any digit 1 to 9 (to ensure there are no preceding zeroes)
\d      # any digit character; equivalent to [0-9]
{0,6}   # perform the preceding match (\d) anywhere from 0 to 6 times
        #    (0,6 instead of 1,7 because we already matched the first digit above)

\.      # match a dot character. Must be escaped with a backslash \ as
        #    the unescaped dot will match *anything* in regex otherwise.

[A-Z]   # any uppercase alphabetic character.
{1,4}   # will repeat the preceding match anywhere from 1 to 4 times.

\-      # match a hyphen character. escaping is optional here.

[XYZ]   # any of X, Y, or Z.

\[      # a literal [ character. Must be escaped.

[1-9]   # matches 1 to 9
\d      # any digit; equivalent to [0-9]
?       # Makes the preceding match optional. Equivalent to {0,1}

\]      # a literal ] character. Must be escaped.

Другие примечания:

Aдействительно хорошим инструментом, который поможет вам лучше понять регулярные выражения, является веб-сайт RegExr.com

0 голосов
/ 08 ноября 2019

Я думаю, вы должны попытаться определить структуру каждого элемента, а затем объединить их. Мне удалось идентифицировать каждую часть, но я не понял последнюю:

Все остальные символы формата являются буквальными.

В любом случае, я надеюсь, это поможет вам. Прочитайте комментарии, включенные в код.

public boolean checkPattern(String s){

     if(s.matches("#000[1-9]{1,7}.[A-Z]{1,4}-([X-Z])\\[[1-9]{1,2}\\]")) return true;
          else return false; 

      // #000[1-9]{1,7} ==> matches PRODUCT_ID

      //. ==> to simply match the point

      // [A-Z]{1,4} ==> PRODUCT_CATEGORY

      //- ==> to simply match this symbol

      // ([X-Z]) ==> LOCATOR_TYPE

      // \\[ Use the double slash here so the [ symbol becomes recognized 

      // [1-9]{1,2} ==> LOCATOR_LOT

      // \\]

      //  String s="#000123.ABC-X[99]"; this is a test example I used.

}

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

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