CdVr
CdVr

Reputation: 313

Regex to get value from <key, value> by asserting conditions on the value

I have a regex which takes the value from the given key as below

Regex .*key="([^"]*)".* InputValue key="abcd-qwer-qaa-xyz-vwxc"

output abcd-qwer-qaa-xyz-vwxc

But, on top of this i need to validate the value with starting only with abcd- and somewhere the following pattern matches -xyz

Thus, the input and outputs has to be as follows:

output for matched

I tried below which is not working as expected

.*key="([^"]*)"?(/Babcd|-xyz).*

The key value pair is part of the large string as below:

object{one="ab-vwxc",two="value1",key="abcd-eest-wd-xyz-bnn",four="obsolete Values"}

I think by matching the key its taking the value and that's y i used this .*key="([^"]*)".*

Note: Its a dashboard. you can refer this link and search for Regex: /"([^"]+)"/ This regex is applied on the query result which is a string i referred. Its working with that regex .*key="([^"]*)".* above. I'm trying to alter with that regexGroup itself. Hope this helps?

Can anyone guide or suggest me on this please? That would be helpful. Thanks!

Upvotes: 0

Views: 1144

Answers (3)

Cary Swoveland
Cary Swoveland

Reputation: 110685

You could use the following regular expression to verify the string has the desired format and to match the portion of the string that is of interest.

(?<=\bkey=")(?=.*-xyz(?=-|$))abcd(?:-[a-z]+)+(?=")

Start your engine!

Note there are no capture groups.

The regex engine performs the following operations.

(?<=\bkey=")  : positive lookbehind asserts the current
                position in the string is preceded by 'key=' 
(?=           : begin positive lookahead
  .*-xyz      : match 0+ characters, then '-xyz'
  (?=-|$)     : positive lookahead asserts the current position is
              : followed by '-' or is at the end of the string
)             : end non-capture group
abcd          : match 'abcd'
(?:           : begin non-capture group
  -[a-z]+     : match '-' followed by 1+ characters in the class
)+            : end non-capture group and execute it 1+ times
(?=")         : positive lookahead asserts the current position is
              : followed by '"'

Upvotes: 0

JvdV
JvdV

Reputation: 75870

Looks like you could do with:

\bkey="(abcd(?=.*-xyz\b)(?:-[a-z]+){4})"

See the demo online

  • \bkey=" - A word-boundary and literally match 'key="'
  • ( - Open 1st capture group.
    • abcd - Literally match 'abcd'.
    • (?=.*-xyz\b) - Positive lookahead for zero or more characters (but newline) followed by literally '-xyz' and a word-boundary.
    • (?: - Open non-capturing group.
      • -[a-z]+ - Match an hyphen followed by at least a single lowercase letter.
      • ){4} - Close non-capture group and match it 4 times.
    • ) - Close 1st capture group.
  • " - Match a literal double quote.

I'm not a 100% sure you'd only want to allow for lowercase letter so you can adjust that part if need be. The whole pattern validates the inputvalue whereas you could use capture group one to grab you key.


enter image description here


Update after edited question with new information:

Prometheus uses the RE2 engine in all regular expressions. Therefor the above suggestion won't work due to the lookarounds. A less restrictive but possible answer for OP could be:

\bkey="(abcd(?:-\w+)*-xyz(?:-\w+)*)"

See the online demo

Upvotes: 3

Bren
Bren

Reputation: 615

Will this work?

Pattern

\bkey="(abcd-[^"]*\bxyz\b[^"]*)"

Demo

Upvotes: 0

Related Questions