2013-03-27 18 views
9

Przyjmijmy następujące ciągi:Regex: wzór mecz, o ile nie jest to na początku

aaa bbb ccc 
bbb aaa ccc 

Chcę dopasować aaa tak długo, jak nie jest na początku łańcucha. Próbuję to zanegować, wykonując coś takiego:

[^^]aaa 

Ale nie sądzę, że to prawda. Korzystanie z preg_replace.

+0

Czy pasujesz tylko do 'aaa'? Zastąpienie tego czym? –

Odpowiedz

24

Możesz użyć spoglądania do tyłu, aby upewnić się, że nie jest na początku. (?<!^)aaa

+0

W każdym razie, aby zanegować asercję pozycji? – StackOverflowNewbie

+1

Nadal muszę uchwycić 'aaa'. Po prostu nawinąć w nawias? – StackOverflowNewbie

+1

Zaktualizowane wyrażenie pobierze je w grupie 0. – Joe

5

Jeśli nie chcesz używać lookbehind następnie użyć tego wyrażenia regularnego:

/.(aaa)/ 

I używać matched group # 1.

+1

To jest najlepsza odpowiedź, ponieważ działa również z innymi dialektami wyrażenia regularnego. – tmalsburg

6

Odkąd przyszedł tu za pomocą wyszukiwarki Google, i był zainteresowany w roztworze, który jest nie używając lookbehind, oto moje 2 centy.

[^^]aaa wzór dopasowuje znak inny niż ^ a następnie 3 a s wszędzie wewnątrz łańcucha. Numer [^...] to negated character class, gdzie ^ nie jest uważany za znak specjalny. Zauważ, że pierwszy ^, który jest tuż po [ jest specjalny, ponieważ oznacza negację, a drugi to tylko literalny symbol karetki.

W ten sposób ^ nie może znajdować się wewnątrz [...], aby wskazać początek ciągu znaków.

Rozwiązaniem jest użycie jakiegokolwiek negatywnego lookaround, te dwa będą działać równie dobrze:

(?<!^)aaa 

i uprzedzona:

(?!^)aaa 

Dlaczego prace uprzedzona też? Lookarounds są to asercje o zerowej szerokości, a kotwice również mają zerową szerokość - nie zużywają tekstu. Dosłownie mówiąc, (?<!^) sprawdza, czy nie ma początku pozycji łańcucha bezpośrednio po lewej stronie bieżącej lokalizacji, a (?!^) sprawdza, czy nie ma początku pozycji łańcucha bezpośrednio po prawej stronie bieżącej lokalizacji. Sprawdzane są te same lokalizacje , dlatego oba działają dobrze.

+1

Dziękujemy za alternatywę, ponieważ JavaScript nie zapewnia jeszcze lepszej obsługi. –