Соответствие регулярному выражению только для номера с повторением двух цифр - PullRequest
0 голосов
/ 25 апреля 2018

Я пытаюсь сопоставить число, которое имеет 2 цифры, и они повторяются, а длина номера составляет 7 цифр.

Я хочу сопоставить эти числа из Java.

пример номера:

3433434
6776767
9000999

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

Ответы [ 5 ]

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

(?=^.{7}$)(\d)\1*(?!\1)(\d)(?:\1|\2)*

Это должно сделать это.Он находит цифру и повторяется, затем находит вторую цифру и повторяется.Затем он проверяет, является ли остаток числа одним из этих 2.

Я подробно объясню, что это делает.

(?=^.{7}$): Перед началом убедитесь, что в нем 7 символовмежду началом и концом.Если короче или длиннее, быстрый сбой.

(\d)\1*(?!\1)(\d): Получить первую цифру и сохранить ее в группе захвата.Затем совпадает, если захваченная цифра также является следующей.Если есть только одна цифра, следующая часть поймает это.Последняя цифра всегда должна отличаться от первой.

(?:\1|\2): повторите 2 захваченные цифры 0 или более раз.

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

Вы можете сделать это следующим образом:

String str = "3433434";
boolean sevenOf2Digits = str.length() == 7 &&
                         str.matches("(\\d)\\1*+(\\d)(\\1|\\2)*");
System.out.println(sevenOf2Digits);

Первая (\\d) захватывает первую цифру в группе 1.

\\1 это обратная ссылка на группу 1, поэтому первая цифра. * равно 0 или более из этих цифр, + делает это притяжательным, что необходимо для предотвращения совпадения следующей (\\d) с той же цифрой.

Следующая (\\d) захватывает вторую цифру в группе 2.

(\\1|\\2)* просто соответствует 0 или более любой комбинации первой или второй цифры.


Я выделил проверку длины для простоты. Если вы хотите получить чистое решение для регулярных выражений, вы можете добавить проверку длины в свое регулярное выражение в виде заглядывания, добавив (?=.{7}$) к началу вашего регулярного выражения.

"(?=.{7}$)(\\d)\\1*+(\\d)(\\1|\\2)*"
0 голосов
/ 25 апреля 2018
    String regex = "[10]{7}|[20]{7}|[21]{7}|[30]{7}|[31]{7}|[32]{7}|[40]{7}|[41]{7}|[42]{7}|[43]{7}|[50]{7}|[51]{7}|[52]{7}|[53]{7}|[54]{7}|[60]{7}|[61]{7}|[62]{7}|[63]{7}|[64]{7}|[65]{7}|[70]{7}|[71]{7}|[72]{7}|[73]{7}|[74]{7}|[75]{7}|[76]{7}|[80]{7}|[81]{7}|[82]{7}|[83]{7}|[84]{7}|[85]{7}|[86]{7}|[87]{7}|[90]{7}|[91]{7}|[92]{7}|[93]{7}|[94]{7}|[95]{7}|[96]{7}|[97]{7}|[98]{7}";

    System.out.println(Pattern.matches(regex, "3433434"));
    System.out.println(Pattern.matches(regex, "6776767"));
    System.out.println(Pattern.matches(regex, "9000999"));

Это должно сделать это.Все комбинации из двух цифр длиной 7.

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

С регулярным выражением это немного сложно, я бы вместо этого использовал (Java 8+):

boolean check = myString.chars()
                .mapToObj(i -> (char) i)
                .collect(Collectors.toSet())
                .size() == 2;

Идея состоит в том, чтобы создать Set с символом этой строки, еслиразмер набора равен 2, тогда он является правильным String, иначе это не так.


Или, как упомянуто в комментарии Ralf Renz , вы можете использовать этот короткий путь:

boolean check = myString.chars().distinct().count() == 2;

Итак, ваше окончательное решение должно выглядеть так:

boolean check = myString.matches("\\d{7}") && myString.chars().distinct().count() == 2;
0 голосов
/ 25 апреля 2018

Я бы рекомендовал скрыть любые регулярные выражения внутри вспомогательных методов:

private static boolean matchesCriteria(String s) {
    return exactlySevenDigits(s) && containsRepeatedDigits(s);
}

private static boolean exactlySevenDigits(String s) {
    return s.matches("\\d{7}");
}

private static boolean containsRepeatedDigits(String s) {
    return s.matches(".*(\\d)\\1.*");
}

Пример результатов:

3433434  true
6776767  true
9000999  true
1234567  false    (no repeating numbers)
12331233 false    (too long)
123356A  false    (not all digits)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...