RegEx для разбора строк между двумя строками в Scala - PullRequest
2 голосов
/ 20 мая 2019

У меня есть текстовый файл в свободной форме (не XML), из которого я хотел бы проанализировать строки между двумя шаблонами. Вот пример данных

<Hi>
col1 col2 col3
1 2 3 
4 5 6
helo how are 

<How>
col1 col2
1 2 
helo hi'

Я хочу проанализировать данные между каждым тегом, т.е. <Hi> и строкой blank, как одну строку. Аналогично данные между <How> и строкой blank как другая строка.

Шаблон регулярных выражений, который я пробовал до сих пор, не работает.

val pattern = "^<Hi>(.*)\\n"
val pattern = "^<Hi>(.*)\\s*$"
val pattern = "^<Hi>(.*)"
val pattern = "^<Network>(.*)((\\r\\n|\\n|\\r)$)|(^(\\r\\n|\\n|\\r))|^\\s*$"

Есть ли способ, которым я могу указать шаблон для пустой строки. Любая помощь приветствуется.

Ответы [ 3 ]

4 голосов
/ 20 мая 2019

Используйте это вместо: [^\>]+(?=\n{2,}|$|\<).Не забудьте использовать глобальный флаг, чтобы найти все совпадения.Вы можете посмотреть объяснение здесь:

https://regexr.com/4e9c1

4 голосов
/ 20 мая 2019

Вы можете использовать это регулярное выражение и собирать данные из группы 1,

<[^>]+>\s*([\w\W]*?(?=\n\n|$))

Regex Demo

Объяснение:

  • <[^>]+>\s* - начать захват тега с помощью <[^>]+> и дополнительных пробелов с \s*
  • ([\w\W]*? - захватить любые символы, включая символы новой строки в не-жадный способ
  • (?=\n\n|$)) - Позитивный взгляд вперед, чтобы гарантировать, что матч останавливается, как только он видит две новые строки или абсолютный конец строки
3 голосов
/ 20 мая 2019

Решение в коде.

val src = io.Source.fromFile("so.txt")

"(?s)>\\s*(.+?)(?=\n\n|$)".r
                          .findAllMatchIn(src.mkString)
                          .map(_.group(1))
                          .mkString("->", "<-\n->", "<-")
//res0: String =
//->col1 col2 col3
//1 2 3
//4 5 6
//helo how are <-
//->col1 col2
//1 2
//helo hi'<-

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