RegEx для несоответствия нескольким точным строкам

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

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

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

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

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

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

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

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

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

Вы также можете проверить это с помощью пользовательской проверки вместо регулярного выражения..!

Rohit Sharma 30.04.2019 20:01

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

CAlex 30.04.2019 20:07

@CAlex Создание валидатора позволит упростить его повторное использование, а также создаст более читаемый код и, наконец, разделит его, что упростит тестирование. Я тоже люблю регулярное выражение, но оно предназначено для сопоставления шаблонов, а не целых слов. Просто прими это во внимание

Akxe 30.04.2019 21:08

@Akxe, это отличный момент. Ваше решение определенно так, как это должно быть сделано. Это не совсем ответ на этот конкретный вопрос, но я думаю, что любой, кто просматривает эту ветку с подобным вопросом, должен использовать собственный валидатор.

CAlex 30.04.2019 21:54
Стоит ли изучать PHP в 2026-2027 годах?
Стоит ли изучать PHP в 2026-2027 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Приемы CSS-макетирования - floats и Flexbox
Приемы CSS-макетирования - floats и Flexbox
Здравствуйте, друзья-студенты! Готовы совершенствовать свои навыки веб-дизайна? Сегодня в нашем путешествии мы рассмотрим приемы CSS-верстки - в...
Тестирование функциональных ngrx-эффектов в Angular 16 с помощью Jest
В системе управления состояниями ngrx, совместимой с Angular 16, появились функциональные эффекты. Это здорово и делает код определенно легче для...
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
1
4
284
2
Перейти к ответу Данный вопрос помечен как решенный

Ответы 2

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

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)$).+$

Демонстрация регулярных выражений

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

CAlex 30.04.2019 20:57

Есть ли способ сделать это нечувствительным к регистру? Я хочу, чтобы любая версия слова потерпела неудачу, поскольку я имею дело с нечувствительной базой данных.

CAlex 30.04.2019 21:51

Ага. Просто добавьте этот встроенный модификатор (?i) перед регулярным выражением и используйте это регулярное выражение (?i)^(?!(?:typescript|C#|python)$).+$ Или, если вы используете подобное /^(?!(?:typescript|C#|python)$).+/, поместите i после последней косой черты, как это /^(?!(?:typescript|C#|python)$).+/i

Pushpesh Kumar Rajwanshi 30.04.2019 21:55

Я попытался установить флаг i, и он не работает, это то, что я пробовал, прежде чем прокомментировать. Это терпит неудачу для любой записи. Я также попробовал метод (?i), и он выдает ошибку. на странице регулярного выражения, на которую вы ссылаетесь, написано: «? Предыдущий токен не поддается количественному определению»

CAlex 30.04.2019 22:06

Это должно сработать, но похоже на проблему с синтаксисом. Можете ли вы показать код, который у вас есть, поместив его в свой пост?

Pushpesh Kumar Rajwanshi 30.04.2019 22:10

Я вижу, что происходит. Свойство построителя формы принимает строку для шаблона, а затем преобразует ее. Итак, (?i)^(?!(?:Blue|Gold|White)$).+$ превратился в /^(?i)^(?!(?:Blue|Gold|White)$).+$/, что вызовет синтаксическую ошибку. Я ничего не могу с этим поделать. Спасибо за помощь!

CAlex 30.04.2019 22:27

Другие вопросы по теме