2012-04-17 10 views
21

Potrzebuję wyrażeń regularnych pasujących do wyrażenia kończącego się granicą słowa, ale które nie uwzględnia łącznika jako granicy. tj uzyskać wszystkie wyrażenia dopasowaneOgraniczenie słowa regex z wyłączeniem łącznika

type ([a-z])\b 

ale nie zgadzają się na przykład

type a-1 

przeformułowanie: chcę odpowiednik operatora granica słowo \ B, która zamiast używania słowa klasę postaci [A-Za-z0-9_] wykorzystuje rozszerzony Klasa: [A-Za-z0-9_-]

+0

Z jakiego aparatu regex korzystasz - czy to jest .NET, javascript itp.? – Jay

+0

@Jay: używam .NET – eyaler

Odpowiedz

19

Można użyć uprzedzona do tego, najkrótsza byłoby użyć negatywny uprzedzona:

type ([a-z])(?![\w-]) 

(?![\w-]) oznaczałoby „fail meczu jeśli następny znak jest w \w lub jest -”.

Tutaj jest opcja, że ​​korzysta z normalnego uprzedzona:

type ([a-z])(?=[^\w-]|$) 

można przeczytać (?=[^\w-]|$) jako „tylko pasuje jeśli następny znak jest nie w klasie znaków [\w-], czy to koniec z strunowy".

Zobacz to działa: http://www.rubular.com/r/NHYhv72znm

+2

można to zrobić bez obejścia? – eyaler

4

miałem dość podobny problem, z wyjątkiem, że nie warto rozważyć „*” jako znaku ograniczającego. Oto co zrobiłem:

\b(?<!\*)[^\s\*]+)\b(?!*) 

Zasadniczo, jeśli jesteś na granicy słowa, spojrzeć wstecz o jeden znak i nie pasuje, jeśli poprzedni znak był „*”. Jeśli jesteś w środku, nie pasuj do spacji ani gwiazdek. Jeśli jesteś na końcu, upewnij się, że koniec nie jest gwiazdką. W twoim przypadku myślę, że możesz użyć \ w zamiast \ s. Dla mnie to zadziałało w następujących sytuacjach:

*word 
wo*rd 
word* 
+2

Twoje wyrażenie regularne ma niepoprawną składnię – MaxZoom

Powiązane problemy