2017-02-06 2 views
1

Мне нужно разделить токены: = == <= >= < > и аккуратно в отдельных регулярных выражениях. В настоящее время у меня есть:Отдельные бинарные операторы регулярных выражений

(=) for = 
[=]{2} for == 
(<=) for <= 
(<) for < 
(>=) for >= 
(>) for > 
\~= for ~= 

, но я боюсь, что они будут мешать друг другу (= косяка матча знак равенства в <=, например)

Любые рекомендации? Я новичок в регулярном выражении, поэтому, если у вас есть ответ, пожалуйста, объясните немного :-)

+0

Альтернативный листинг, наиболее специфичный для наименее специфического: '(abc | ab | a)' соответствует abc * или * ab * или * a ... –

+1

Они не будут вмешиваться. Если вы задаете группу захвата, такую ​​как '(<=)', она __must__ соответствует всем значениям внутри, которые не указаны как необязательные и поэтому не будут соответствовать '=' или '> =' или '~ =' и т. Д. ... –

+0

, но '(=)' & '(<=)' будет соответствовать '' a <= b "', что является его проблемой, я думаю, –

ответ

1

Это зависит от вашей среды и двигателя регулярных выражений! Если это двигатель DFA или POSIX NFA, то вы всегда будете соответствовать самым длинным, самым левым возможным рисунком. Вы можете определить, работает ли ваш двигатель таким образом, пытаясь соответствовать

nfa|nfa not 

против струны "nfa not". Если вся строка соответствует, то вы знаете, что работаете с самым длинным, самым левым движком, т.е. DFA или POSIX NFA.

Однако наиболее распространенным типом двигателя является традиционный NFA, где вам предоставляется много выразительной силы и контроля с вашими регулярными выражениями, но, как обычно, эта мощность несет ответственность. В традиционной NFA не гарантируется самая длинная левая часть. Я объясню решение Alex K's abc | ab |. '|' (называемый OR или чередование) - это способ сказать совпадение abc OR ab. Вы можете задаться вопросом: «Что, если текст« abc »? В этом случае каждый работает!». Это правда! И в традиционной NFA, варианты проверяются слева направо. Поэтому в традиционной NFA поиск ab | abc в тексте «abc» будет соответствовать «ab», а поиск abc | ab будет соответствовать целым «abc». Вы можете воспользоваться этим, выполнив поиск в вашем тексте < = | =, чтобы вы всегда получали '< =', а не только '='.

Оказалось, что решение Alex K будет работать независимо от двигателя, потому что «< =» также является самым длинным, самым левым совпадением. Я думал, что дам более глубокое объяснение, чтобы дать некоторое понимание и, возможно, вызвать интерес. Ознакомьтесь с «Освоение регулярных выражений» Дж. Фридла, если вы хотите узнать больше!

+0

Спасибо за объяснение! До того, как я получил «правило не может быть сопоставлено», но когда я прочитал это, я понял, что должен был поставить их в другом порядке. так как я хочу, чтобы они разделены (GT, GTEQ, LT и т.д.) я просто положить их в следующем порядке: [=] {2} (<=) \t (> =) \t \ ~ = (>) (<) (=) – Louise

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