RegEx для не совпадения нескольких точных строк - PullRequest
1 голос
/ 30 апреля 2019

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

Например, пользователь уже ввел эти значения в базу данных:

["typescript", "C#", "python"]

Когда они вводят одно из этих уже существующих значений в поле ввода ТОЧНО, я хочу, чтобы появилось сообщение валидатора.

У меня есть этот отрицательный взгляд вперед, Regex из другого ответа, который я нашел:

^(?!.*(typescript|C#|python)).*$

, но проверка не пройдёт, если одно из этих слов появится в любом месте входной строки (например, «pythons» потерпит неудачу).Я просто хочу, чтобы он потерпел неудачу, если одно из этих слов будет отображаться именно на входе.

РЕДАКТИРОВАТЬ

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

Ответы [ 2 ]

2 голосов
/ 30 апреля 2019

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

typescript
C#
python

Отрицательный взгляд вперед, который вы хотели использовать, требуетзаписать так:

^(?!(?:typescript|C#|python)$).+$

Regex Demo

1 голос
/ 30 апреля 2019

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

export function usedNames(validNames: string[]): ValidatorFn {
  return (control: AbstractControl): {[key: string]: any} | null => {
    if (validNames.includes(control.value)) {
      return null;
    } else {
      return { usedNames: {value: control.value} };
    }
  };
}

Использование (реактивная форма):

new FormGroup({
  'language': new FormControl(this.hero.name, [
    Validators.required,
    usedNames(['typescript', 'C#', 'python']) // <-- Here's how you pass in the custom validator.
  ]),
  // ... (other inputs)
});

Использование (шаблон):

@Directive({
  selector: '[appUsedNames]',
  providers: [{provide: NG_VALIDATORS, useExisting: UsedNamesDirective, multi: true}]
})
export class UsedNamesDirective implements Validator {
  @Input('appUsedNames') usedNames: string;

  validate(control: AbstractControl): {[key: string]: any} | null {
    return this.usedNames ? usedNames(this.usedNames)(control) : null;
  }
}

Кроме того, вы должны подумать о том, чтобы сделать его select вместо input или добавить list & <datalist> к входу, чтобы пользователь знал, чтоон может печатать ...

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