/ / Regex Negative Lookahead problem - regex, negatywny lookahead

Regex Negative Lookahead issue - regex, negative-aheadhead

Myślę, że to się nazywa negatywne spojrzenie w przód (nowe w wyrażeniu regularnym) w każdym razie, nie uzyskując pożądanych rezultatów. Próbuję go użyć, aby zdyskwalifikować lub zakwalifikować całą grupę

(? (?! The | Cross) (w +) Street)

Więc chcę uchwycić grupę STREET, gdy jest to Main Street lub Bank Street, ale nie The Street ani Cross Street.

Za ciąg „The Street” dostaję

  • ULICA: „on Street”

podobnie jak w przypadku „Cross Street”

  • ULICA: „Ross Street”

To, czego szukam, nie pasuje, tzn. „Twój wzór nie odpowiada podciągowi”

Czy istnieje sposób na zastosowanie negatywnego spojrzenia w ten sposób? Innymi słowy, AnyWord Street pasuje do mojego wzorca, The Street i Cross Street nie zwracają zerowych dopasowań i nie mają wartości dla etykiety.

Odpowiedzi:

1 dla odpowiedzi № 1

Korzystanie z granicy słów (b) da ci to, czego chcesz.

Przykład Javascript:

/(?!The|Cross)(bw+ )Street/.test("Main Street")
// => true
/(?!The|Cross)(bw+ )Street/.test("Bank Street")
// => true
/(?!The|Cross)(bw+ )Street/.test("The Street")
// => false
/(?!The|Cross)(bw+ )Street/.test("Cross Street")
// => false

0 dla odpowiedzi nr 2

Twoje wymaganie jest dwuznaczne. Napisałeś „Chcę uchwycić grupę STREET, gdy jest to Main Street lub Bank Street, ale nie The Street ani Cross Street”.

Ten warunek można zredukować do jednego z nich

  1. „Chcę uchwycić grupę STREET, gdy jest to Main Street lub Bank Street” lub
  2. „Chcę uchwycić grupę STREET, gdy nie jest to The Street ani Cross Street”.

Te warianty różnią się od innych.

Ale twój przykład kodu dąży do drugiej alternatywy. Dlatego odpowiedź poniżej dotyczy drugiego wyboru.

Przykłady odpowiadają składni Perla:

 /(?<!The|oss)s+Street/

Objaśnienie: W Perlu lookbehind (? <= Fixed-regexp) działa tylko dla wyrażeń regularnych o stałej szerokości. Dlatego znaki „Cr” z „Krzyża” zostały usunięte.

Osłabienia wyrażenia regularnego z „Cross” na „oss” można uniknąć w następujący sposób:

 /(?<!The)(?<!Cross)s+Street/