2009-02-13 19 views

Odpowiedz

26

To brzmi jak zadanie dla lookbehinds, choć należy pamiętać, że nie wszystkie smaki regex je wspierać. W przykładzie:

(?<=\bipsum\s)(\w+) 

To będzie dowolną sekwencję znaków pisma, które następuje „go” jako całe słowo następnie przestrzeni. nie pasuje „bardzo” sam, nie trzeba się martwić o ponownym włożeniem w przypadku np zamienniki.

Jako 1 powiedział, choć niektóre smaki (JavaScript, na przykład) nie obsługują lookbehind w ogóle. Wiele innych (większość w rzeczywistości) obsługuje tylko „stała szerokość” lookbehinds - tak można użyć tego przykładu, ale nie każdy z operatorów powtórzenia. (Innymi słowy,(?<=\b\w+\s+)(\w+)nie będzie działać).

+0

bicie mnie też :) – annakata

+0

Lookbehinds wydają się być dość ograniczone, jeśli chodzi o używanie symboli wieloznacznych. – cletus

+0

Lookbehinds może nie być nawet konieczne tutaj. W zależności od tego, co "chcę dopasować" w pytaniu, patrz rozwiązanie Davida Kempa. – user55400

-1

że \ b \ b

EDIT (. *): chociaż w zależności od implementacji regex, to może być głodny i znaleźć wszystkie słowa po tym

+0

To będzie pasować do reszty zdania. – cletus

+0

musisz zrobić to nieuporządkowanym – tliff

+0

W rzeczywistości nie jest to zależne od implementacji, lub przynajmniej nigdy nie natknąłem się na implementację regex, która domyślnie nie jest chciwa. Non-chciwy jest zawsze przełącznikiem (przynajmniej w Perlu, PHP, Java i .Net). – cletus

1

że \ b (\ w *)

+0

To wydaje się pasować tylko do ipsum. –

+0

Prawdopodobnie sprawiłbym, że \ b + (\ w +) co najmniej – cletus

+0

ipsum \ b + (\ w +) nie jest poprawnym wyrażeniem regularnym. –

4

Niektóre z innych reagujących sugerowali przy użyciu wyrażenia regularnego, które nie zależą od lookbehinds, ale 1 myśleć kompletny, przykład praca jest potrzebna, aby uzyskać punkt w poprzek. Chodzi o to, że można dopasować całą sekwencję („badań” plus następne słowo) w normalny sposób, a następnie użyć grupę przechwytywania wyizolować część, która Cię interesuje. Na przykład,

String s = "Lorem ipsum dolor sit amet, consectetur " + 
    "adipiscing elit. Nunc eu tellus vel nunc pretium " + 
    "lacinia. Proin sed lorem. Cras sed ipsum. Nunc " + 
    "a libero quis risus sollicitudin imperdiet."; 

Pattern p = Pattern.compile("ipsum\\W+(\\w+)"); 
Matcher m = p.matcher(s); 
while (m.find()) 
{ 
    System.out.println(m.group(1)); 
} 

Zauważ, że ten drukuje zarówno „inteligentny” i „teraz”. Aby to zrobić z wersją lookbehind, trzeba by zrobić coś takiego hackish:

Pattern p = Pattern.compile("(?<=ipsum\\W{1,2})(\\w+)"); 

to Java, który wymaga lookbehind mają oczywisty maksymalną długość. Niektóre smaki nie mają nawet to dużą elastyczność i oczywiście, niektóre nie obsługują lookbehinds w ogóle.

jednak problemowe największe ludzie wydają się mieć w swoich przykładach nie jest z lookbehinds, ale z granicami słownych. Zarówno David Kemp i CK wydają się spodziewać \b dopasować znak spacji po „M”, ale tak nie jest; dopasowuje pozycja (ramce) pomiędzy „m” i przestrzeni.

Jest to częsty błąd, jeden 1've widział nawet powtarzane w kilku książek i samouczki, ale konstrukt słowo granica, \b nie odpowiada żadnych znaków. Jest to o zerowej szerokości twierdzenie, jak lookarounds i kotew (^, $, \z, etc.), a co pasuje to stanowisko, które jest albo poprzedzoną znakiem słowa i nie następuje po drugim, lub po nim znaku słownego i nie poprzedzone jednym.

0

Z javascript można użyć (?=ipsum.*?(\w+))

To będzie drugie wystąpienie, jak również (Nunc)