(regexp) Как исключить из поиска ненужные вхождения?

Доброго времени суток. Имеется подобное регулярное выражение
("originalText":")(<i>)*([A-Za-z0-9\(\) ',.!?-]+)(</i>)*(","text":")(<)*([А-Яа-я0-9A-Za-z\(\) ,.!?-]+)(</i>\.|</i>)*",

Которое я использую для замены в файле на $1$2$3$4$5$2$7$4",
Файл в одну строку и 10 259 006 символов

Это файл (словарь) перевода игры, который неграмотно перевели машинным переводом. В результате в русском тексте сломались или потерялись теги <i> </i>, этим регулярным выражением я могу исправить большинство (но не все) ошибки. Но проблема в том что это регулярное выражение делает пустую работу, а именно находит "здоровый" текст и заменяет его на него же. Меняет
"originalText":"English text.","text":"Русский текст.",
на
"originalText":"English text.","text":"Русский текст.",

Можно как то это исправить?

А именно, как исключить из поиска текст, в котором между "originalText":" и ","text":" нет <i> или </i>
Поясню на примерах

"originalText":"English text.","text":"Русский текст.",        - Этот текст должно пропуска
"originalText":"<i>English text.","text":"Русский текст.",     - Этот текст должно заменять
"originalText":"English text.</i>","text":"Русский текст.",    - Этот текст должно заменять
"originalText":"<i>English text.</i>","text":"Русский текст.", - Этот текст должно заменять


Моих знаний не хватает что бы написать такое регулярное выражение. Моих знаний не хватает даже что бы как то грамотно составить поисковый запрос что бы найти ответ в гугле. И тут я грамотно заголовок не смог составить...
  • Вопрос задан
  • 74 просмотра
Решения вопроса 1
K14Mua
@K14Mua Автор вопроса
Отвечаю самому себе на вопрос. Решить мою проблему можно так

("originalText":")((<i>)[A-Za-z0-9\(\) ',.!?-]+|[A-Za-z0-9\(\) ',.!?-]+(<\/i>)|(<i>)[A-Za-z0-9\(\) ',.!?-]+(<\/i>))(","text":")(<)*([А-Яа-я0-9A-Za-z\(\) ,.!?-]+)(</i>\.|</i>)*",
Ответ написан
Комментировать
Пригласить эксперта
Ответы на вопрос 1
VoidVolker
@VoidVolker
Dark side eye. А у нас печеньки! А у вас?
Итак, у вас там файл в формате JSON. Это специальный машиночитаемый формат данных. Более правильное решение в вашем случае выглядит следующим образом:
  1. Открываем JSON файл в любом редакторе, который его поддерживает
  2. Приводим его специальной командой в нормальный вид
  3. Смотрим на его структуру и определяем поля, с которыми надо работать - в вашем случае originalText и text
  4. Далее пишем простейший скрипт на JS (или любом другом вашем любимом ЯП) для чтения и парсинга:
    import { readFileSync } from "node:fs"
    let data, result = []
    try {
        data = JSON.parse(readFileSync('file', 'utf8'))
    } catch (e) {
        console.error('Ошибка загрузки файла', e)
    }
  5. Реализуем требуемую вам логику по работе с текстом:
    for(let item of data) // В данном случае, предполагается, что data - это массив
    {
        // Полезная работа
    }
  6. А после - сохраняем результат в другой файл:
    fs.writeFileSync("result.json", JSON.stringify(result));


Т.о. вся работа сводится к работе с однозначным и конкретным куском текста. У вас классический случай Проблемы XY.
Ответ написан
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы