Регулярное выражение React js найдите все слова, начинающиеся и заканчивающиеся на __

#javascript #reactjs #regex #file

Вопрос:

У меня есть такой txt-файл:

 Io sottoscritto/a __NOME__
nato a __CITTA_NASCITA__(__SIGLA_CITTA_NASCITA__) il __DATA_NASCITA__
residente a __RESIDENZA__   in via __VIA_RESIDENZA__    n __NUMERO_RESIDENZA__.
 

Я должен убедиться, что при загрузке пользователем соответствующего файла создается массив, содержащий все слова, начинающиеся с __ и заканчивающиеся__, типа __NAME__

Мне удалось это сделать проблема в том, что регулярное выражение также находит для меня следующие слова вместе: ["__CITTA_NASCITA__(__SIGLA_CITTA_NASCITA__)", "__NUMERO_RESIDENZA__."]

В первом случае два слова должны быть разделены.

Во втором случае не должно быть конечной точки.

Результат:

["__CITTA_NASCITA__", "__SIGLA_CITTA_NASCITA__", "__NUMERO_RESIDENZA__"]

Можете ли вы сказать мне, где я ошибаюсь?

ссылка: https://codesandbox.io/s/lively-butterfly-ey8og?file=/src/App.js

 export default function App() {
  const showFile = async (e) => {
    e.preventDefault();
    const reader = new FileReader();
    reader.onload = async (e) => {
      const text = e.target.resu<
      const row = text.split("n");
      let array = [];
      row.map((el) =>
        el.split(" ").map((ul) => {
          var reg = /^__[A-Za-z]*__/;
          if (reg.test(ul)) {
            console.log(ul);
            array.push(ul);
          }
        })
      );
      console.log(array);
    };
    reader.readAsText(e.target.files[0]);
  };

  return (
    <div className="App">
      <input type="file" onChange={(e) => showFile(e)} />
    </div>
  );
}
 

Комментарии:

1.Вы могли бы сопоставить все вхождения в файле __[A-Z] (?:_[A-Z] )*__ regex101.com/r/oUmIJQ/1

2. Проблема в том, что весь текст разбивается с помощью ввода строк на строки, а затем каждая строка разделяется пробелом, и элементы проверяются вашим регулярным выражением (это даже не проверяет, соответствует ли шаблон всему «маркеру». Таким образом, знаки препинания и многое другое могут попасть в результирующий массив. Смотрите мой ответ, как это исправить.

Ответ №1:

Вы можете исправить код, извлекая все совпадения непосредственно из text переменной:

  const reg = /__[A-Z_] __/ig;

  const showFile = async (e) => {
    e.preventDefault();
    const reader = new FileReader();
    reader.onload = async (e) => {
      const text = e.target.resu<
      let array = text.match(reg);
      setArray(array);
    };
    reader.readAsText(e.target.files[0]);
  };
 

Примечание. Если вы разрешаете только одно подчеркивание между __ разделителями, вам нужно будет использовать

 const reg = /__[A-Z] (?:_[A-Z] )*__/ig;
 

Кроме того, смотрите row row.map(...) , что части кода и здесь не нужны.

Комментарии:

1. Что вы подразумеваете под: const reg = /__[A-Z] (?:_[A-Z] )*__/ig; ; Когда его следует использовать?

2. @Пол Чуть ниже export default function App() { . Замените showFile на мою версию. Замените свой showFile на весь мой фрагмент кода.

3. @Paul Какие-нибудь проблемы с этим? Должен ли я скопировать весь код из вашей демо-версии кода с внедренным исправлением?

4. Я не могу понять, в чем разница между использованием этого: /__[A-Z] (?:_[A-Z] )*__/ig /__[A-Z_] __/ig

5. @Paul Посмотрите эту демонстрацию против этой . /__[A-Z_] __/ig совпадения __DATA_NASCITA____RESIDENZA__ как единое целое.

Ответ №2:

Я вижу код и запускаю пример в песочнице, я немного изменил регулярное выражение на «[A-Za-z_] ?» теперь это более точно и работает соответственно так, как вы хотели.

![вывод] введите описание изображения здесь

Комментарии:

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