Регулярное выражение ReactJS не работает с разделенной строкой

По сути, я хотел проверить имя на основе текста, сначала взятого из файла .txt, а затем разделенного. Текст выглядит примерно так:

Paris
Museum
1
...

и код выглядит так:

const handleValidation = (data:string) => {
    let pattern = /^[a-zA-Z0-9]{1,10}$/;
    let title = data.split('\n')[0];

    console.info(title);  // returns "Paris" and is a string
    console.info(pattern.test(title));  // returns false
    console.info(pattern.test("Paris"));  // returns true
}

Но когда вместо названия я ввожу «Париж», то по какой-то причине это работает, хотя они должны действовать одинаково. Кто-нибудь знает, что может быть причиной этой проблемы?

🤔 А знаете ли вы, что...
JavaScript имеет множество библиотек и фреймворков, таких как jQuery, Angular, и Vue.js.


1
50
1

Ответ:

Решено

Проблема, с которой вы столкнулись, скорее всего, связана со скрытыми символами в строке title, когда вы читаете ее из файла. Несмотря на то, что это выглядит как "Paris", могут быть дополнительные символы, такие как возврат каретки (\r), конечный пробел или что-то подобное, что приводит к сбою проверки.

Вот почему это происходит:

  1. Когда вы разделяете строку с помощью split('\n'), она разрывается на символе новой строки, но любые дополнительные символы, такие как \r (распространенный в Windows) или пробелы, все равно могут быть присоединены к title.
  2. Поэтому, когда вы проверяете pattern.test(title), возвращается false, потому что title не совсем "Paris" — это что-то вроде "Paris\r" или "Paris ".

Быстрое решение

Просто обрежьте строку title, чтобы удалить ненужные символы:

const handleValidation = (data: string) => {
    let pattern = /^[a-zA-Z0-9]{1,10}$/;
    let title = data.split('\n')[0].trim();  // .trim() removes extra spaces and characters

    console.info(title);  // now this should print exactly "Paris"
    console.info(pattern.test(title));  // and this should return true
}

Используя .trim(), вы очистите строку, и ваша проверка должна работать как положено!