2009-06-29 2 views
14

В настоящее время я строю игрушечный ассемблер в C# (через The Elements Of Computing Systems).Регулярное выражение - соответствие шаблону перед персонажем

Мне нужно подобрать очень простой шаблон, я подумал, что это будет подходящее время, чтобы изучить некоторое регулярное выражение, но я борюсь!

В следующих примерах, которые я бы хотел, чтобы соответствовать буквы перед '='

M = A

D = M

MD = A

A = D

AD = M

AMD = A

Я придумал следующее:

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

Однако это также совпадает с «=», которые я не хочу.

Я также попытался:

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

Но я до сих пор та же проблема - это совпадает с «=» знак, а также.

Я использую this site для проверки своих регулярных выражений.

Любая помощь была бы действительно оценена. Спасибо заранее.

+0

Вы также должны получить. Группы [1] .Value.ToStrin g(), чтобы получить соответствующий раздел от знака = – DevelopingChris

ответ

26

То, что вы хотите, называется нулевой ширины, предпросмотр утверждение. Вы делаете:

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

В вашем случае, это было бы:

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

Следующая группа будет все перед "=" и все после.

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

он читает что-то вроде этого:

матча любого количества символов, то будет не «=», а затем «=», то любое количество символов, то будет не «=».

+0

Я пробовал ваше регулярное выражение в http://www.nregex.com/nregex/default.aspx Это, похоже, не работало - может быть что-то с движком регулярных выражений, который использует сайт? В любом случае, я отметил ответ, чтобы не волноваться. Спасибо хоть. – bplus

+0

Проблема с этим регулярным выражением может заключаться в том, что если он многострочный, второй подстановочный знак будет соответствовать части после текущего знака равенства, новой строки, а затем символов до следующего знака равенства. Вы хотите добавить символ разделителя во вторую пару квадратных скобок. –

0

Вы также можете поместить знак равенства в не захватывающие параны с (?: ...)

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

Это было немного, так как я сделал эту главу книги, но я думаю, что, так как вам нужно обе части выражения в любом случае, я сделал раскол на = приводит к туАггау [0] == М , туАггау [1] ==

+0

Не захватывающие парнеры ничего полезного не сделают. Знак равенства будет по-прежнему «захвачен» как часть общего матча, чего пытается избежать ОП. –

-2

мне нужно, чтобы соответствовать каждому символу перед «=», поэтому я придумал с этим

.*(?==)= 

спичек каждый символ перед «=», но не «=»

+0

Вопрос уже был адекватно дан, и я просто сопоставил '==' с вашим выражением, поэтому он не работает. Спасибо за участие. –

+0

Теперь, когда я сравнивал поведение с соответствующим ответом, я вижу, что это не то, чего хотел OP. – Tola

Смежные вопросы