Почему, я всегда получаю ложное совпадение с регулярным выражением, как его проверить и отладить, и в какой момент условие становится ложным? - PullRequest
1 голос
/ 07 мая 2019

У меня ниже строки Я пытаюсь написать шаблон регулярных выражений в Java

**String value = "ABC6072103325000100120190429R070001";**

 please consider space bar for the part of the string 
 ABC6 0721 033250001001 20190429 R 07 0001
  • 1-я часть - CNV6

    Макс. Длина -> длина всегда 4, буквенно-цифровойA-Z0-9

  • 2-я часть - 0721

    длина всегда 4, допускаются только 0-9 цифр

  • 3-йдеталь - 033250001001

    длина всегда 12, разрешены только цифры

  • 4-я часть - 20190507,

    формат всегда ГГГГММДД, разрешены только цифры максимальная длина 8

  • 5-я часть - R

    Постоянно всегда R, приходящий в этом случае

  • 6-я часть - 07

    разрешено только 2 цифры

  • 7-я часть - 0001

    разрешено 1-4 только цифры

По моим сведениямЯ написал ниже регулярное выражение, но в каждой моей попытке оно становится ложным.

String s = "[A-Z0-9]{4}[0-9]{16}[1-9][0-9]{3}[0(1-9)|1(0-2)][0(1-9)|1(0- 
9)|z(0-9)|3(0-1)](R0)(1-9)0(0-9){1,3}";

Ниже выводится моя программа

package regextest;

import java.util.regex.Matcher;
import java.util.regex.Pattern;

public class RegexTest {
public static String regex ="[A-Z0-9]{4}[0-9]{16}[1-9][0-9]{3}[0(1-9)|1(0-2)] \r\n[0(1-9)|1(0-9)|2(0-9)|3(0-1)](R0)(1-9)0(0-9){1,3}";
public static void main(String[] args) {
    String stringToMatch = "ABC6072103325000100120190429R070001";
    boolean isValid = isValidRegex(stringToMatch);
    System.out.println("isValid : " + isValid);
}

public static boolean isValidRegex(String stringToMatch) {
    boolean isValid =false;

      // Create a Pattern object
      Pattern r = Pattern.compile(regex);

      // Now create a matcher object.
      Matcher m = r.matcher(stringToMatch);
      if (m.find( )) {
     System.out.println("Matched");
     isValid = true;
      }else {
         System.out.println("NO MATCH");
         isValid = false;
      }
    return isValid;
}
}

output - NO MATCH

Ответы [ 2 ]

2 голосов
/ 10 мая 2019

о вашем шаблоне:

В этих частях [0(1-9)|1(0-2)] и [0(1-9)|1(0-9)|z(0-9)|3(0-1)]( Я думаю, что вы собираетесь использовать | в качестве ИЛИ, но это не работает в классе символов .

Первая часть, например, равна [)(0-9] из-за 0 и диапазонов 1-9 и 0-2. Поэтому вторая часть также не будет подходить для соответствия дате как формат.

Чтобы сопоставить количество цифр без более конкретной даты, такой как шаблон, вы можете использовать:

[A-Z\d]{4}\d{4}\d{12}\d{8}R\d{2}\d{4}

В Java

String regex = "[A-Z\\d]{4}\\d{4}\\d{12}\\d{8}R\\d{2}\\d{4}";

Вы также можете использовать [0-9] вместо \\d

Regex demo

Примечание

Чтобы сопоставить шаблон типа даты с YYYYMMDD для сужения возможных принятых цифр, вы можете использовать следующее регулярное выражение, но это не будет проверять саму дату.

^\d{4}(?:1[012]|0[1-9])(?:3[01]|[12][0-9]|0[1-9])$

Regex demo

2 голосов
/ 07 мая 2019

Как проверить и отладить регулярное выражение? Лично я всегда использую один из тех сайтов, которые существуют для этой цели. Например:

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

В вашей реальной ситуации это регулярное выражение должно работать нормально

[A-Z0-9]{4}[0-9]{16}[1-9][0-9]{3}[0(1-9)|1(0-2)][1-9][0-9]{2}R[0-9]{2}[0-9]{1,4}

Ваше регулярное выражение начало работать не в конце даты.

[0(1-9)|1(0-9)|z(0-9)|3(0-1)]

Эта часть никогда не совпадает с частью месяца и дня даты, поэтому ваше регулярное выражение никогда не находило вхождения.

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