Шаблон RegEx из двух букв или цифр, за которыми следуют цифры - PullRequest
0 голосов
/ 05 августа 2020

Не могли бы вы помочь мне создать правильное регулярное выражение? Это должно быть 2 буквы или цифры, за которыми следуют цифры.

These would be valid: 
AA00
AB12
A123
1234

These would not
1DAA
D1D2
DDDD

Вот мой пример кода

public void installFilterOnlyNumberAndLetters(final TextField tf) {
tf.textProperty().addListener(new ChangeListener<String>() {
  @Override
  public void changed(ObservableValue<? extends String> observable, String oldValue, String newValue) {
    if (newValue != null && !newValue.matches("(([A-Z][A-Z0-9])||([A-Z][A-Z])|(|\\d\\d))\\d+")) {
      tf.setText(newValue.replaceAll("[^(([a-z][a-z0-9])||([a-z][a-z])|(|\\d\\d))\\d+]", ""));
    }
  }
});

}

Ответы [ 2 ]

1 голос
/ 05 августа 2020

У вас проблемы с вашим мышлением.

Вы просите: Если ввод недействителен, удалите его.

Это проблематично; невозможно, за исключением вставки, когда-либо получить действительный ввод без «прохождения» недопустимого ввода.

Допустим, я хочу ввести AA00, который действителен.

Я нажимаю в вашем текстовое поле, введите «A», и мой A немедленно стирается. В конце концов, 'A' недействителен.

Даже если вы попытаетесь учесть это, разрешив использование одного символа или изменив правило «что действительно» с помощью: «Одна буква или di git тоже действительно ", то, что вы создали сейчас, невероятно раздражает. Если я вставляю идентификатор из другого места, и мой идентификатор начинается с пробела, тогда я думаю, что мой компьютер сломан: я вставляю «AA00», и мой текст просто исчезает на мне.

* 1012 пользовательский интерфейс.

Вот альтернативный, столь же простой подход:

Вы добавляете измененный слушатель. Вы проверяете ввод. Если ввод действителен, раскрасьте фон элемента ввода светло-зеленым оттенком. Если поле ввода пусто, раскрасьте его в цвет фона по умолчанию. В противном случае придайте ему красный оттенок.

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

Практическое правило довольно простое: Не связывайтесь с вводом пользователя, если вы не действительно, ДЕЙСТВИТЕЛЬНО знаю, что вы делаете .

Вы создали действительно сложное регулярное выражение. Этот тривиальный ответ будет соответствовать именно тому, что вы просили: 2 символа, которые могут быть буквами или цифрами, за которыми следует любое количество цифр:

Pattern.compile("^[a-zA-Z0-9]{2}[0-9]*$")

- это все, что вам нужно. Он даже читается так, как вы спросили: «2 буквы / цифры», затем «любое количество цифр».

0 голосов
/ 05 августа 2020

предполагаемый минимальный размер 4 для ниже - может быть изменен по мере необходимости

public static final String C2_PRE_STR = "([a-zA-Z]{2}|\\d{2})\\d{2,}";

public static void main(String[] args) {
    List<String> valids = List.of("AA00", "AB123", "AA2345", "1234", "12345");
    List<String> invalids = List.of("1DAA", "D1D2", "DDDD", "A1", "11");

    System.out.printf("%10s %10s %10s %10s\n", "input", "expected", "actual", "matching?");
    valids.forEach(s -> System.out.printf("%10s %10s %10s %b\n", s, s, validatedValue(s), s.matches(C2_PRE_STR)));
    invalids.forEach(s -> System.out.printf("%10s %10s %10s %b\n", s, "", validatedValue(s), s.matches(C2_PRE_STR)));
}

private static String validatedValue(String input) {
    return input.matches(C2_PRE_STR) ? input : "";
}

производит ниже

> Task :RegEx.main()
     input   expected     actual  matching?
      AA00       AA00       AA00 true
     AB123      AB123      AB123 true
    AA2345     AA2345     AA2345 true
      1234       1234       1234 true
     12345      12345      12345 true
      1DAA                       false
      D1D2                       false
      DDDD                       false
        A1                       false
        11                       false
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...