2013-07-22 3 views
1

Я бы хотел найти все вхождения определенной строки между двумя строками, например.Regex, чтобы найти все вхождения определенной строки между двумя строками

some line nobody is interested in 
this is the beginning 
this is of no interest 
attention 
not interesting 
this is the ending 

Как бы регулярное выражение выглядеть, чтобы найти «внимания» между «это начало» и «это окончание»? Есть ли способ достичь этого?

+2

Было бы хорошо, если бы вы especify движок регулярных выражений, которые вы хотите. – DontVoteMeDown

+0

Я хотел бы включить это в сценарий оболочки в 'bash' – swalkner

+0

Вы не так понятны. Вы хотите, чтобы совпадающее слово было правильным после фразы и прямо перед этим, или просто быть посреди них? – DontVoteMeDown

ответ

2

Try группа 1 этого регулярное выражение:

(?s)this is the beginning.*?(attention).*?this is the ending 

FYI (?s) поворот на "точка соответствует новой строки"

+0

в patterns.app, это работает; к сожалению, в моем скрипте оболочки, использующем egrep, это не так: 'egrep: операнд операнда-повторения недействителен' – swalkner

+0

Используйте опцию' -P' с egrep, которая активирует perl-regexp – Bohemian

+0

:(похоже, это довольно большое дело в OSX : no perl-regex on Mountain Lion есть :( – swalkner

0

Обмен "==" в любой шаблон вы должны соответствовать

bool foundStart = false; 
for line in lines{ 
    if (line == "this is the beginning") 
     foundstart = true; 
    else if(line == "this is the ending") 
     foundstart = false; //set to false if could come beginning again 
     break; //or break directly 
    else if (foundstart && line == interestingpattern) 
     interesting_lines.Add(line); 
} 

или регулярное выражение что-то вроде этого, если вам нужно только одно присутствие «интересного»:

re1='.*?' # Non-greedy match on filler 
re2='(start)' # Word 1 //exchange to your pattern for start 
re3='.*?' # Non-greedy match on filler 
re4='(interesting)' # Word 2/Exchange to your pattern for interesting 
re5='.*?' # Non-greedy match on filler 
re6='(end)' # Word 3 // exchange to your ending pattern 

затем скомпилировать (re1+re2+re3+re4+re5+re6) и вынимают только re4

0

Попробуйте

var test = "some line nobody is interested in this is the beginning this is of no interest attention not interesting this is the ending"; 

var testRE = (test.match("this is the beginning (.*) this is the endin")); 
alert(testRE[1].match(/attention/g).length);