Разделите строку по начальной и конечной строкам - PullRequest
0 голосов
/ 15 ноября 2018

В RI есть ряд строк, таких как:

"Новое: \ r \ nRemote_UI: Невозможно запустить приложение Apple CarPlay (P3_DA18018395_012) (91735) \ r \ nMedia: после того, как iPhone авторизован как BTAНа устройстве впервые громкость развлечения внезапно обнуляется, когда пользователь выбирает песню из «Текущего списка треков» (DA18018395_015) \ r \ n \ r \ nKnown: \ r \ nHWR в записи навигации не считывается (89412)"

Я хотел бы получить что-то вроде:

New:
[1] Remote_UI: Apple CarPlay application cannot be started (P3_DA18018395_012) (91735)
[2] Media: After an iPhone is authorised as BTA device for the first time, Entertainment volume is abruptly set to zero when the user picks a song from "Current tracklist" (DA18018395_015)

Known:
[1] HWR in navigation entry is not read out (89412)

Обратите внимание, что может быть только" Новое ", только" Известно ", ни один из них или оба в другом порядке.Есть идеи?Спасибо!

1 Ответ

0 голосов
/ 19 ноября 2018

Вы можете использовать

x <- "New:\r\nRemote_UI: Apple CarPlay application cannot be started (P3_DA18018395_012) (91735)\r\nMedia: After an iPhone is authorised as BTA device for the first time, Entertainment volume is abruptly set to zero when the user picks a song from \"Current tracklist\" (DA18018395_015)\r\n\r\nKnown:\r\nHWR in navigation entry is not read out (89412)"
New <- regmatches(x, gregexpr("(?:\\G(?!\\A)\\R+|New:\\R+)\\K.+(?!\\R+\\w+:\\R)", x, perl=TRUE))
Known <- regmatches(x, gregexpr("(?:\\G(?!\\A)\\R+|Known:\\R+)\\K.+(?!\\R+\\w+:\\R)", x, perl=TRUE))

См. Демоверсию R онлайн .

Выход:

[[1]]
[1] "Remote_UI: Apple CarPlay application cannot be started (P3_DA18018395_012) (91735)\r"                                                                                                     
[2] "Media: After an iPhone is authorised as BTA device for the first time, Entertainment volume is abruptly set to zero when the user picks a song from \"Current tracklist\" (DA18018395_015"

[[1]]
[1] "HWR in navigation entry is not read out (89412)"

Используемое регулярное выражение:

(?:\G(?!\A)\R+|New:\R+)\K.+(?!\R+\w+:\R)

См. Демоверсию regex онлайн . Второе регулярное выражение отличается от этого только буквальным словом Known.

Детали

  • (?:\G(?!\A)\R+|New:\R+) - конец предыдущего матча и 1+ разрывов строк (\G(?!\A)\R+) или (|) New:, а затем 1 или более разрывов строк (\R+)
  • \K - оператор сброса совпадений, отбрасывающий весь найденный текст
  • .+ - 1+ символов, кроме символов разрыва строки, как можно больше
  • (?!\R+\w+:\R) - отрицательный прогноз, который не соответствует совпадению, если непосредственно справа от текущего местоположения имеются:
    • \R+ - 1+ разрывов строк,
    • \w+ - 1+ слово символов
    • : - двоеточие
    • \R - разрыв строки.
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...