Wyrażenie regularne na słowo poprzedzone spacją

0

Jak powinno wyglądać wyrażenie regularne, które namierzy frazę "abc", ale tylko wtedy, gdy przed tą frazą będzie spacja?
Prawie prawidłowo działa \b(abc)
Ale niestety, namierza "abc" również w poniższych:

xyz\abc
xyz/abc
xyz.abc
xyz,abc

A ja bym chciała, żeby tych wyżej nie namierzał, a poniższe tak:

xyz abc
xyz abcxyz xyz
xyz abc xyz

No i przy tym nie chcę, żeby spacja była częścią namierzenia, czyli " abc" nie jest idealnym rozwiązaniem.

3

Hmm... lookbehind?
(?<=\s)abc
https://regex101.com/r/fN5tB0/1

Edit: \s w przypadku dowolnego whitespace (\r\n\t\f ), jak chcesz samą spację to (?<= )abc.

0

(abc) [czyli spacja a potem fraza],
ew. \s(abc) jeżeli to ma być dowolny whitespace

@Wizzie podał nawet lepsze rozwiązanie, u mnie trzeba używać capture groups, tutaj od razu bierzesz cały match.

0

@Pawilonek, @alagner

No i przy tym nie chcę, żeby spacja była częścią namierzenia, czyli " abc" nie jest idealnym rozwiązaniem.

@Wizzie, dzięki, dokładnie o to chodziło.
I działa z ((?<=\s)|^) ^^ Genialne.

0

I jedna rzecz, zastanów się czy \s czy [spacja], bo \s złapie Ci też schemat na początku linii

0

@aurel Ich sposób też działa, tylko trochę inaczej. Nie wiem czego używasz, ale w Pythonie właściwy wynik będzie w drugiej grupie:

import re
match = re.search(' (abc)', 'xyz abc')
print(match.group(0))  # zwraca ' abc'
print(match.group(1))  # zwraca 'abc'

Edit: Cofam to, to chyba nie tak działa.
Edit2: Albo i działa, nie chce mi się sprawdzać dokładniej.

0
aurel napisał(a):

No i przy tym nie chcę, żeby spacja była częścią namierzenia, czyli " abc" nie jest idealnym rozwiązaniem.

Dlatego najpierw jest spacja a abc w nawiasach. Przechwytywane jest wtedy tylko to co jest w nawiasach. Chyba, że w jakiś inny sposób próbujesz wyciągnąć te dane.

@Wizzie w php tak działa :)
http://www.phpliveregex.com/p/fhO
W zerowym elem. tab. jest całość a w pierwszym właśnie to co jest w nawiasach.

0

Wiecie, przede wszystkim reszta regexpa to wcale nie jest "abc" ;) tylko coś znacznie dłuższego i częściowo budowane jest programowo. Jest do tego podpięte sporo kodu, które leci pętelką po Matches. Umiem grzebać w grupach, ale po co? Czy nie lepiej po prostu dopasować od razu tylko to, co mnie interesuje? W ten sposób będę musiała zmienić tylko jedno miejsce w kodzie. A jedno miejsce to mniej niż dwa miejsca :P

0

Rozwiązanie z grupami (np. "[ ]+(abc)") wygląda na najbardziej uniwersalne, ale jeśli Ci działa to "lookbehind" to chyba nie ma się co zastanawiać - użyj to co Ci bardziej pasuje.

0

Regex do czegoś tak prostego, jak ciąg poprzedzony spacją wydaje mi się na wyrost. Nie masz jakiegoś indexOf albo wręcz split?

1 użytkowników online, w tym zalogowanych: 0, gości: 1