regex - R: (*SKIP)(*FAIL) for multiple patterns -


given test <- c('met','meet','eel','elm'), need single line of code matches e not in 'me' or 'ee'. wrote (ee|me)(*skip)(*f)|e, exclude 'met' , 'eel', not 'meet'. because | exclusive or? @ rate, there solution returns 'elm'?

for record, know can (?<![me])e(?!e), know solution (*skip)(*f) , why line wrong.

this correct solution (*skip)(*f):

(?:me+|ee+)(*skip)(*fail)|e 

demo on regex101, using following test cases:

met meet eel elm degree zookeeper meee 

only e in elm, first e in degree , last e in zookeeper matched.

since e in ee forbidden, e in after m forbidden, , e in substring of consecutive e forbidden. explains sub-pattern (?:me+|ee+).

while aware method not extensible, @ least logically correct.

analysis of other solutions

solution 0

(ee|me)(*skip)(*f)|e 

let's use meet example:

meet        # (ee|me)(*skip)(*f)|e ^           # ^  meet        # (ee|me)(*skip)(*f)|e   ^         #        ^  meet        # (ee|me)(*skip)(*f)|e   ^         #               ^             # forbid backtracking pattern left             # set index of bump along advance current position  meet        # (ee|me)(*skip)(*f)|e   ^         #                  ^             # pattern failed. no choice left. bump along.             # note backtracking before (*skip) forbidden,             # e in second branch not tried  meet        # (ee|me)(*skip)(*f)|e   ^         # ^             # can't match ee or me. try other branch  meet        # (ee|me)(*skip)(*f)|e    ^        #                    ^             # found match `e` 

the problem due fact me consumes first e, ee fails match, leaving second e available matching.

solution 1

\w*(ee|me)\w*(*skip)(*fail)|e 

this skips words ee , me, means fail match in degree , zookeeper.

demo

solution 2

(?:ee|mee?)(*skip)(?!)|e 

similar problem solution 0. when there 3 e in row, first 2 e matched mee?, leaving third e available matching.

solution 3

(?:^.*[me]e)(*skip)(*fail)|e 

this throws away input last me or ee, means valid e before last me or ee not matched, first e in degree.

demo


Comments

Popular posts from this blog

css - SVG using textPath a symbol not rendering in Firefox -

Java 8 + Maven Javadoc plugin: Error fetching URL -

order - Notification for user in user account opencart -