2012-12-17 12 views
9

Chcę skrobać dane z jakiegoś tekstu i zrzucić go do tablicy. Rozważmy następujący tekst jako przykład danych:Regex - Pasujący tekst PO niektórych znakach

| Example Data 
| Title: This is a sample title 
| Content: This is sample content 
| Date: 12/21/2012 

Obecnie używam następujące regex zeskrobać dane, które są określone po znaku „grubego”:

/((?=:).+)/ 

Niestety regex chwyta także okrężnicy i przestrzeń po dwukropku. Jak mogę pobrać tylko te dane?

Ponadto, nie jestem pewien, czy robię to dobrze .. ale wygląda na to, że zewnętrzne parens powoduje, że dopasowanie zwraca tablicę. Czy to jest funkcja parens?

EDIT: używam Rubular przetestować moje wyrażenia regex

Odpowiedz

15

Można go zmienić na:

/: (.+)/ 

i chwyć zawartość grupy 1. lookbehind działa zbyt, choć i robi tylko to, co pytasz:

/(?<=:).+/ 
2

Poza użytkownika @ minitech odpowiedź, można również dokonać 3rd odmianę:

/(?<=: ?)(.+)/ 

Różnica polega na tym, że tworzysz/łapiesz grupę, korzystając z niej samej.

Jeśli nadal wolisz patrzeć z wyprzedzeniem, a nie patrzeć za siebie. . .

/(?=: ?(.+))/ 

Spowoduje to umieszczenie grupy wokół istniejącego wyrażenia regularnego, w którym zostanie przechwycone w obrębie grupy.

A tak, nawias zewnętrzny w kodzie spowoduje, że dopasowanie zostanie wykonane za pomocą. Porównajmy to z ostatnim przykładem, który podałem, gdy całe spojrzenie jest "zgrupowane", zamiast niepotrzebnie używać /(...)/ bez /(?= ...)/, ponieważ pierwszy wynik w większości silników wyrażeń regularnych zwraca cały dopasowany ciąg.

+0

Dziękuję za wyjaśnienia - wygląda na to, że pierwszy regex ma błąd (nieprawidłowy wzorzec w niedostatku). W każdym razie wydaje się, że będę musiał dużo więcej nauczyć się na temat grupowania/patrzenia z tyłu. –

+0

Skórki o zmiennej długości są niedozwolone, więc '/ (? <=:?) (. +) /' Nie będzie działać. – Ryan

0

Wiem, że pytasz o regex, ale właśnie zobaczyłem rozwiązanie regex i okazało się, że jest raczej trudne do odczytania dla osób niezaznajomionych z regex.

Używam również Ruby i postanowiłem zrobić go z:

line_as_string.split(": ")[-1] 

to robi to, czego potrzebują i IMHO jest to o wiele bardziej czytelny. Dla bardzo długich ciągów może być niewydajny. Ale nie w tym celu.

Powiązane problemy