cjb_01852
cjb_01852

Reputation: 35

PCRE Regex: Exclude last portion of word

I am trying to write a regex expression in PCRE which captures the first part of a word and excludes the second portion. The first portion needs to accommodate different values depending upon where the transaction is initiated from. Here is an example:

Raw Text:

.controller.CustomerDemographicsController

Regex Pattern Attempted:

\.controller\.(?P<Controller>\w+)

Results trying to achieve (in bold is the only content I want to save in the named capture group):

.controller.CustomerDemographicsController

NOTE: I've attempted to exclude using ^, lookback, and lookforward.

Any help is greatly appreciated.

Upvotes: 1

Views: 60

Answers (2)

Ryszard Czech
Ryszard Czech

Reputation: 18611

Also, use

\.controller\.(?P<Controller>[A-Za-z]+)[A-Z]

See proof.

EXPLANATION:

--------------------------------------------------------------------------------
  \.                       '.'
--------------------------------------------------------------------------------
  controller               'controller'
--------------------------------------------------------------------------------
  \.                       '.'
--------------------------------------------------------------------------------
  (?P<Controller>           group and capture to Controller:
--------------------------------------------------------------------------------
    [A-Za-z]+                any character of: 'A' to 'Z', 'a' to 'z'
                             (1 or more times (matching the most
                             amount possible))
--------------------------------------------------------------------------------
  )                        end of Controller group
--------------------------------------------------------------------------------
  [A-Z]                    any character of: 'A' to 'Z'

Upvotes: 0

Wiktor Stribiżew
Wiktor Stribiżew

Reputation: 626699

You can match word chars in the Controller group up to the last uppercase letter:

\.controller\.(?P<Controller>\w+)(?=\p{Lu})

See the regex demo. Details:

  • \.controller\. - a .controller\. string
  • (?P<Controller>\w+) - Named capturing group "Controller": one or more word chars as many as possible
  • (?=\p{Lu}) - the next char must be an uppercase letter.

Note that (?=\p{Lu}) makes the \w+ stop before the last uppercase letter because the \w+ pattern is greedy due to the + quantifier.

Upvotes: 1

Related Questions