Регулярное выражение 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
}

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

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

Tim Biegeleisen 31.08.2024 14:14

Вместо использования console.info(title); зачастую более информативно использовать что-то вроде console.info("<"+title+">");, чтобы были видны любые пробелы и т. д. вокруг заголовка. Согласно @SerajVahadti, на любой стороне строки может быть CR.

AdrianHHH 31.08.2024 16:48

Если в вашем data есть новая строка перед Paris, то вы будете проверять пустую строку, что даст вам false.

Get Off My Lawn 31.08.2024 17:36
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Улучшение производительности загрузки с помощью Google Tag Manager и атрибута Defer
Улучшение производительности загрузки с помощью Google Tag Manager и атрибута Defer
В настоящее время производительность загрузки веб-сайта имеет решающее значение не только для удобства пользователей, но и для ранжирования в...
Безумие обратных вызовов в javascript [JS]
Безумие обратных вызовов в javascript [JS]
Здравствуйте! Юный падаван 🚀. Присоединяйся ко мне, чтобы разобраться в одной из самых запутанных концепций, когда вы начинаете изучать мир...
Система управления парковками с использованием HTML, CSS и JavaScript
Система управления парковками с использованием HTML, CSS и JavaScript
Веб-сайт по управлению парковками был создан с использованием HTML, CSS и JavaScript. Это простой сайт, ничего вычурного. Основная цель -...
JavaScript Вопросы с множественным выбором и ответы
JavaScript Вопросы с множественным выбором и ответы
Если вы ищете платформу, которая предоставляет вам бесплатный тест JavaScript MCQ (Multiple Choice Questions With Answers) для оценки ваших знаний,...
1
3
50
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 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(), вы очистите строку, и ваша проверка должна работать как положено!

Спасибо! На самом деле это решило мою проблему. Для меня это должно быть очевидно с самого начала. Но все равно большое спасибо

user27132062 31.08.2024 22:30

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