2010-09-13 21 views
10

Potrzebuję wyrażenia regularnego, które wyodrębnić tekst wewnątrz separatora ale jestem mające problem wydobywania wartości wewnątrz separatora [Dane n] i [END DATA]RegEx mecz tekst pomiędzy ogranicznikami

Oto mój regex

(?<=\[DATA\s+\d+\]).*(?=\[END DATA\]) 

Oto przykład dane Chcę dopasować

jakiś tekst tutaj

[DATA 1] 
data one 
some more data 
[END DATA] 
[DATA 2] 
data two 
more data 
data 
[END DATA] 
[DATA n] 
more data 
data 
[END DATA] 

Odpowiedz

20

Ci wydają się być za pomocą wyrażeń regularnych takich jak lookbehind i uprzedzona, gdy tak naprawdę nie potrzebują. Spróbuj:

\[DATA\s+\d+\](.*?)\[END DATA\] 

Jest tylko jedna grupa przechwytywania w tym wyrażeniu regularnym, (.*?). Po użyciu tego, wynik szukasz powinna być w grupie przechwytywania 1.

Należy również zauważyć, że Użyłem non-chciwy .*? mecz, który będzie pasował aż do pierwszy następującym instancji [END DATA]. Bez tego, jeśli użyjesz tylko .*, zrobisz wszystko, co do ostatnie[END DATA].

5

W regex, [ tekst między ] nazywany jest klasą znaków, a silniki wyrażeń regularnych będą pasowały tylko do jeden znak znaków między nawiasami. Wystarczy umieścić backslashy aby je dosłowny:

(?<=\[DATA\s+\d+\]).*(?=\[END DATA\]) 
+0

Przepraszam Zmontowałem mój post, powinien on zawierać \ dla nawiasów. dzięki. ale nadal nie wyodrębnia danych wewnątrz separatora btw używam expresso – dynamicvoid

+0

To działało świetnie dla mnie (? <= \ [). * (? = \]) dla tekstu takiego jak: [TEKST] – tkrn

+0

To rozwiązanie nie " wydaje się działać. –

1

Użyj znaku \, aby uciec.

\[DATA\s\d\]+([^\[]+)\[[^\]]+\] 
4

Znak specjalny kropki domyślnie nie pasuje do znaków nowej linii. Upewnij się, że używasz pojedynczej linii modyfikator do wykonania regex lub użyj [\S\s]*? zamiast .*?

Zobacz http://www.regular-expressions.info/modifiers.html i http://www.regular-expressions.info/dot.html szczegóły.

+0

Lepiej określić liniowy modyfikator jednowierszowy za pomocą '(? S)' z przodu. –

+0

Tak, to zdecydowanie opcja. Nie sądzę, że jest to obsługiwane przez wszystkie implementacje regex. O ile mi wiadomo, JavaScript nie obsługuje tej składni. Pytanie nie jest szczegółowe, dlatego właśnie zasugerowałem coś, co powinno działać w większości (jeśli nie wszystkich) przypadków. –

+0

Chcę wyodrębnić wszystkie dane wewnątrz separatora i powinien on być wieloliniowy, tak, zgadzam się. *? nie ma zastosowania. – dynamicvoid