2009-06-29 19 views
14

Obecnie buduję asembler zabawki w języku C# (przechodząc przez książkę The Elements Of Computing Systems).Regex - Dopasuj wzór przed postacią

Muszę dopasować bardzo prosty wzór, myślałem, że to byłby dobry czas, aby nauczyć się regex, ale walczę!

W poniższych przykładach Chciałbym tylko, aby dopasować litery przed '='

M = A

D = M

MD = A

A = D

AD = M

AMD = A

mam wymyślić, co następuje:

([A-Z]{1,3})= 

Jednak to również pasuje do „=”, który nie chcę.

Próbowałem również:

([A-Z^\=]{1,3})= 

Ale nadal mam ten sam problem - to pasuje do „=” znak, jak również.

Używam this site do testowania moich wyrażeń regularnych.

Każda pomoc będzie naprawdę doceniana. Z góry dziękuję.

+0

Należy również uzyskać .Groups [1] .Value.ToStrin g(), aby uzyskać odpowiednią sekcję od znaku = – DevelopingChris

Odpowiedz

26

Co chcesz nazywany jest zero-width, uprzedzona twierdzenie. Zrobić:

 
(Match this and capture)(?=before this) 

W Twoim przypadku będzie to:

 
([A-Z^]{1,3})(?==) 
4

Poniższa grupa wola wszystko przed „=” i po wszystkim.

([^=]*)=([^=]*) 

czyta coś takiego:

mecz dowolną ilość znaków to jest to nie „=”, a następnie „=”, a następnie dowolną ilość znaków to jest to nie „=”.

+0

Próbowałem Twojego wyrażeń regularnych w http://www.nregex.com/nregex/default.aspx Wydawało się, że nie działa - może być coś z silnikiem regex, że witryna korzysta? W każdym razie zaznaczam teraz odpowiedź, więc nie martw się. W każdym razie dzięki. – bplus

+0

Problem z tym wyrażeniem regularnym może polegać na tym, że jeśli jest wieloliniowy, drugi znak wieloznaczny będzie pasował do części za bieżącym znakiem równości, znakiem nowej linii, a następnie znakami przed następnym znakiem równości. Chcesz dodać znak ogranicznika wewnątrz drugiej pary nawiasów kwadratowych. –

0

Możesz również umieścić znak równości w nieprzechwyconych paranach z (?: ...)

([ADM]{1,3})(?:=) 

Minęło trochę ponieważ zrobiłem ten rozdział tej książki, ale myślę, że skoro trzeba obie części wyrazu tak, zrobiłem podział na = skutkujących myArray [0] == M , myArray [1] ==

+0

Niewprowadzające parens nie zrobią niczego użytecznego. Znak równości będzie nadal "przechwytywany" w ramach całego meczu, czego OP próbował uniknąć. –

-2

musiałem dopasować każdy znak przed '=', więc wymyśliłem tego

.*(?==)= 

Mecze każdy znak przed '=' ale nie "="

+0

Na to pytanie już udzielono odpowiedniej odpowiedzi. Właśnie dopasowałem wyrażenie "==" do wyrażenia, więc nie działa. Dziękujemy za udział. –

+0

Teraz, kiedy porównałem zachowanie do odpowiedniej odpowiedzi, widzę, że nie tego chciał OP. – Tola

Powiązane problemy