Regex для получения абзаца между одним и тем же словом - PullRequest
0 голосов
/ 02 августа 2020

У меня есть такой текстовый файл

...
(Some text to introduce the list)
...

UserInfo
  User:"user"
  Email:"user@example.com"
  Phone:"12341234"
  OtherItem:"123"
UserInfo
  User:"user"
  Email:"user@example.com"
  Phone:"12341234"
  OtherItemA:"123"
  OtherItemB:"123"
UserInfo
  User:"user"
  Email:"user@example.com"
  Phone:"12341234"
  OtherItemA:"123"
  OtherItemB:"123"
   -OtherSubItemC:"123"
    -OtherSubItemD:"123"
UserInfo
  User:"user"
  Email:"user@example.com"
  Phone:"12341234"
UserInfo
  User:"user"
  Email:"user@example.com"
  Phone:"12341234"
...
...
...

Это список, в котором хранится информация о пользователе Текстовый файл

Теперь моя задача - проанализировать эти данные в файл json или csv, который может обрабатываться программой и отображать пользователя в таблице.

Мое решение использует javascript для выполнения:

fetch("./list.txt").then(async i=>{
    window.myString = await i.text() // get string by text
    list = myString.match(/"(.*)"/g)
})

Теперь я могу получить массив вроде этого:

["user","user@example.com"......]

И я обнаружил, что не все пользователи имеют одинаковое количество информации. поэтому я не могу просто разделить массив, чтобы стать массивом пользователей.

Но, к счастью, у каждого пользователя есть UserInfo перед абзацем и UserInfo в другом месте.

Итак, у меня есть идея, которая использует регулярное выражение или другую функцию, чтобы получить текст между UserInfo , например:

[
'  User:"user"
  Email:"user@example.com"
  Phone:"12341234"
  OtherItem:"123"',

'User:"user"
  Email:"user@example.com"
  Phone:"12341234"
  OtherItemA:"123"
  OtherItemB:"123"',
]

И я буду oop строку элемента для создать объект.

Но я не знаю, как получить абзац с помощью регулярного выражения.

Я пробовал что-то вроде /UserInfo(.*)UserInfo/g, но все они не соответствовали.

Кто угодно может мне помочь?

Ответы [ 2 ]

1 голос
/ 02 августа 2020

Используйте

/^UserInfo(?:\n[ \t].*)*/gm

См. доказательство

ПОЯСНЕНИЕ

NODE                     EXPLANATION
--------------------------------------------------------------------------------
  ^                        the beginning of the line
--------------------------------------------------------------------------------
  UserInfo                 'UserInfo'
--------------------------------------------------------------------------------
  (?:                      group, but do not capture (0 or more times
                           (matching the most amount possible)):
--------------------------------------------------------------------------------
    \n                       '\n' (newline)
--------------------------------------------------------------------------------
    [ \t]                    any character of: ' ', '\t' (tab)
--------------------------------------------------------------------------------
    .*                       any character except \n (0 or more times
                             (matching the most amount possible))
--------------------------------------------------------------------------------
  )*                       end of grouping
0 голосов
/ 02 августа 2020

Вы можете попробовать это!

(?<=UserInfo)(\s*^.*\n*)*?(?=UserInfo)

Он получает все, кроме последней записи. Это можно исправить, добавив последний «UserInfo» в этот список. Обратите внимание, что это решение не включает UserInfo как часть текстового соответствия.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...