#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/12. Проблема в том, что весь текст разбивается с помощью ввода строк на строки, а затем каждая строка разделяется пробелом, и элементы проверяются вашим регулярным выражением (это даже не проверяет, соответствует ли шаблон всему «маркеру». Таким образом, знаки препинания и многое другое могут попасть в результирующий массив. Смотрите мой ответ, как это исправить.
Ответ №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. Это работает только в тестере регулярных выражений. В коде вывод не является ожидаемым из-за дополнительной предварительной обработки, используемой операцией.