2017-02-01 3 views
0

Строки S выглядит следующим образом:Получить предшествующую линию и следующую строку для UPPERCASEWORD

S = "HOLY CROWS \n This looks scary. \n Horror score rises. \n MAYBE I should ask \n STACKOVERFLOW \n They would know." 

Желаемой Выход:

"Я должен спросить StackOverflow Они будут знать."

В основном:

Найти каждый матч, который имеет одинарное верхний регистр слово, которые завернуты в следующих условиях:

  • Получить строку после UPPERCASEWORD до разрыва строки.
  • Получить строку, предшествующую UPPERCASEWORD, до тех пор, пока не встретится ANOTHERUPPERCASEWORD, если и нет, если между ними не было разрывов строк.

Вот что я до сих пор:

\w\n\w[A-Z]+\n.*?\w 

Но это не покорить полную линию до и после слова. Он также не выполняет второе требование.

Выходной ток:

"К StackOverflow Т"

+0

Попробуйте ['[AZ] {2}. * \ R? \ N. * [AZ] {2}. * \ R? \ N. *'] (Https://regex101.com/r/hw4LxQ/1). Я предполагаю, что вы хотели бы соответствовать ALLCAPS длиной не менее 2 букв. В противном случае попробуйте ['\ b [AZ] + \ b. * \ R? \ N. * \ B [AZ] + \ b. * \ R? \ N. *'] (Https://regex101.com/ г/hw4LxQ/2). –

ответ

1

Вы можете использовать следующее регулярное выражение:

(?:^|\r?\n)(.*?)\r?\n([A-Z]+)r?\n(.*?)(?:\r?\n|$) 

и получить следующие группы:

$1 $2 $3 

Это будет соответствовать любому заглавному слову, непосредственно предшествовавшему и сопровождаемому разрывом строки. Все, что происходит перед первой линией, и после последнего разрыва строки будет внутри группы.

  • (?:) совпадает с группой, не будучи пронумерованы (как $1, $2)
  • .*? соответствует 0 или более символов лениво (нежадным)
  • \r?\n соответствует Windows, \r\n и UNIX \n LineBreak
  • ^ и $ начало и конец строки

Вот live example.

 Смежные вопросы

  • Нет связанных вопросов^_^