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

Given test <- c('met','meet','eel','elm'), I need one line of code that matches any element of e that is not in 'me' or 'ee'. I wrote (ee|me)(*SKIP)(*F)|ethat excludes 'met' and 'eel', but not 'meet'. Is it because it |is exceptional or? Anyway, is there a solution that just returns "elm"?

For the record, I know what I can also do (?<![me])e(?!e), but I would like to know what the solution is for (*SKIP)(*F)and why my line is incorrect.

+4
source share
3 answers

This is the right solution with (*SKIP)(*F):

(?:me+|ee+)(*SKIP)(*FAIL)|e

Demo on regex101, :

met
meet
eel
elm
degree
zookeeper
meee

e elm, e degree e zookeeper .

e ee , e m , e e . - (?:me+|ee+).

, , , , .

0

(ee|me)(*SKIP)(*F)|e

meet:

meet        # (ee|me)(*SKIP)(*F)|e
^           # ^

meet        # (ee|me)(*SKIP)(*F)|e
  ^         #        ^

meet        # (ee|me)(*SKIP)(*F)|e
  ^         #               ^
            # Forbid backtracking to pattern to the left
            # Set index of bump along advance to current position

meet        # (ee|me)(*SKIP)(*F)|e
  ^         #                  ^
            # Pattern failed. No choice left. Bump along.
            # Note that backtracking to before (*SKIP) is forbidden,
            # so e in second branch is not tried

meet        # (ee|me)(*SKIP)(*F)|e
  ^         # ^
            # Can't match ee or me. Try the other branch

meet        # (ee|me)(*SKIP)(*F)|e
   ^        #                    ^
            # Found a match `e`

, me e, ee , e .

1

\w*(ee|me)\w*(*SKIP)(*FAIL)|e

ee me, , - degree zookeeper.

2

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

0. 3 e, 2 e mee?, e .

3

(?:^.*[me]e)(*SKIP)(*FAIL)|e

me ee, , e me ee , e degree.

+5

/ , .

gsub('\\w*[em]e\\w*(*SKIP)(?!)|e', '', test, perl=T)

@CasimiretHippolyte /mdash; "e"...

gsub('(?:ee|mee?)(*SKIP)(?!)|e', '', test, perl=T)

( ( )):

gsub('[em]e+(*SKIP)(?!)|e', '', test, perl=T)

: (?!) (*F), .

(?!)    # equivalent to ( (*FAIL) or (*F) - both synonyms for (?!) ), 
        # causes matching failure, forcing backtracking to occur

, (*SKIP)(*FAIL), (*SKIP)(*F) (*SKIP)(?!)

+4

\w* , , , ee me , .

:

\w*(ee|me)\w*(*SKIP)(*FAIL)|e

R-regex ,

> test <- c('met','meet','eel','elm')
> gsub("\\w*(?:ee|me)\\w*(*SKIP)(*FAIL)|e", "fi", perl=TRUE, test)
[1] "met"  "meet" "eel"  "film"

> gsub('(?:^.*[me]e)(*SKIP)(*FAIL)|e', 'fi', test, perl=T)
[1] "met"  "meet" "eel"  "film"

enter image description here

+3

All Articles