Я пытаюсь ограничить то, что пользователь может вводить в поле на основе предыдущих записей, которые уже существуют.
Например, пользователь уже ввел эти значения в базу данных:
["typescript", "C#", "python"]
Когда они ТОЧНО вводят одно из этих уже существующих значений в поле ввода, я хочу, чтобы появилось сообщение валидатора.
У меня есть этот негативный взгляд вперед Regex из другого ответа, который я нашел:
^(?!.*(typescript|C#|python)).*$
но проверка не пройдет, если одно из этих слов появится где-нибудь во входной строке (например, «питоны» не пройдут проверку). Я просто хочу, чтобы он потерпел неудачу, если одно из этих слов появится точно на входе.
РЕДАКТИРОВАТЬ
В итоге я использовал собственное решение для проверки подлинности, представленное ниже. Приведенное ниже регулярное выражение также сработало. Как уже говорилось, валидаторы являются правильным решением для этой конкретной проблемы.
@RohitSharma Я использую пакет динамических форм, и, насколько я могу судить, создание строки регулярного выражения намного проще.
@CAlex Создание валидатора позволит упростить его повторное использование, а также создаст более читаемый код и, наконец, разделит его, что упростит тестирование. Я тоже люблю регулярное выражение, но оно предназначено для сопоставления шаблонов, а не целых слов. Просто прими это во внимание
@Akxe, это отличный момент. Ваше решение определенно так, как это должно быть сделано. Это не совсем ответ на этот конкретный вопрос, но я думаю, что любой, кто просматривает эту ветку с подобным вопросом, должен использовать собственный валидатор.





Вы не должны использовать регулярное выражение, так как это излишество, используйте пользовательский валидатор
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> к вводу, чтобы пользователь знал, что он может ввести...
Поскольку вы предпочитаете искать решение с регулярным выражением, вы можете использовать это регулярное выражение для отклонения совпадений, когда это точно одно из этих,
typescript
C#
python
Негативный взгляд вперед, который вы хотели использовать, должен быть написан так:
^(?!(?:typescript|C#|python)$).+$
Демонстрация регулярных выражений
Это то, что я искал. В моем случае предпочтительнее иметь простую строку регулярного выражения, чем создавать целый собственный валидатор.
Есть ли способ сделать это нечувствительным к регистру? Я хочу, чтобы любая версия слова потерпела неудачу, поскольку я имею дело с нечувствительной базой данных.
Ага. Просто добавьте этот встроенный модификатор (?i) перед регулярным выражением и используйте это регулярное выражение (?i)^(?!(?:typescript|C#|python)$).+$ Или, если вы используете подобное /^(?!(?:typescript|C#|python)$).+/, поместите i после последней косой черты, как это /^(?!(?:typescript|C#|python)$).+/i
Я попытался установить флаг i, и он не работает, это то, что я пробовал, прежде чем прокомментировать. Это терпит неудачу для любой записи. Я также попробовал метод (?i), и он выдает ошибку. на странице регулярного выражения, на которую вы ссылаетесь, написано: «? Предыдущий токен не поддается количественному определению»
Это должно сработать, но похоже на проблему с синтаксисом. Можете ли вы показать код, который у вас есть, поместив его в свой пост?
Я вижу, что происходит. Свойство построителя формы принимает строку для шаблона, а затем преобразует ее. Итак, (?i)^(?!(?:Blue|Gold|White)$).+$ превратился в /^(?i)^(?!(?:Blue|Gold|White)$).+$/, что вызовет синтаксическую ошибку. Я ничего не могу с этим поделать. Спасибо за помощь!
Вы также можете проверить это с помощью пользовательской проверки вместо регулярного выражения..!