2015-02-24 2 views
0

Учитывая следующий текст:Как выбрать блок текста, содержащий строку регулярным выражением?

Lorem ipsum dolor 
sit amet, consectetur 
adipiscing elit. 

Phasellus id 
tristique est. 

Mauris eget massa leo. 
Pellentesque egestas 
ante vitae finibus luctus. 

Nam tristique metus 
nec semper semper. 

Возможно ли, чтобы соответствовать 2 блоков, содержащих строку tristique с помощью регулярного выражения?

Таким образом, они были бы 2 матча:

Phasellus id 
tristique est. 

Nam tristique metus 
nec semper semper. 
+0

Какой язык вы используете? –

ответ

2

Вы можете попробовать ниже регулярное выражение.

(?s)\b(?:(?!\n\n).)*?\btristique\b(?:(?!\n\n).)* 

DEMO

(?:(?!\n\n).)* соответствует любому символу, но не \n\n, ноль или более раз.

0

Разумный способ состоит в том, чтобы разделить строку по абзацу (\n\n+) и после этого найти абзацы с «tristique». Это может быть самый быстрый путь.

пример

Javascript:

var result = text.split(/^\n+|\n\n+/).filter(function (elt) { 
    return /\btristique\b/.test(elt); 
}); 

Чтобы сделать ту же самую задачу в одном кадре, и предотвратить много возвратов, вам нужно использовать расширенные функции регулярных выражений, которые не доступны в JavaScript. Пример с PHP:

$pattern = <<<'EOD' 
~^ 
# non-empty lines without the target word 
(?: 
    (?=\N) #check if there is one character 
    # content without the target word 
    [^t\n]*+ #all until a "t" or a newline 
    (?: \Bt+[^t\n]* | t+(?!ristique\b)[^t\n]*)*+ #when a "t" is met 
    \n #a newline 
)*+ 

# characters until the target word 
[^t\n]*+ 
(?: \Bt+[^t\n]* | t+(?!ristique\b)[^t\n]*)*+ 
(*SKIP) # if the target word doesn't follow then skip the substring 

tristique # target: note that word boundaries are implicit 
\N*  # trailing characters 
(?:\n\N+)* # following non empty lines 
~mx 
EOD; 

if (preg_match_all($pattern, $text, $matches)) { 
// do what you have to do 
} 
Смежные вопросы