javascript - Match simple regex pattern using JS (key: value) -


i have simple scenario want match follow , capture value:

stuff_in_string, env: 'local', // want match , capture content in quotes more_stuff_in_string 

i have never written regex pattern before excuse attempt, aware totally wrong.

this trying say:

  • match "env:"
  • followed none or more spaces
  • followed single or double quote
  • capture until..
  • the next single or double quote

/env:*?\s+('|")+(.*?)+('|")/g

thanks

ps here #failed fiddle: http://jsfiddle.net/dfhge/

note: regex ended using (not answer below overkill needs): /env:\s+(?:"|')(\w+)(?:"|')/

you can use this:

/\benv: (["'])([^"']*)\1/g 

where \1 backreference first capturing group, content in second. simple way simple cases.

now, other cases like:

env: "abc\"def" env: "abc\\" env: "abc\\\def" env: "abc'def" 

you must use more constraining pattern:

first: avoid different quotes problem:

/\benv: (["'])((?:[^"']+|(?!\1)["'])*)\1/g 

i put possible content in non capturing group can repeat @ will, , use negative lookahead (?!\1) check if allowed quote not same captured quote.

second: backslash problem:

if quote escaped, can't closing quote! must check if quote escaped or not , allow escaped quotes in string.

i remove backslashes allowed content:

/\benv: (["'])((?:[^"'\\]+|(?!\1)["'])*)\1/g 

i allow escaped characters:

/\benv: (["'])((?:[^"'\\]+|(?!\1)["']|\\[\s\s])*)\1/g 

to allow variable number of spaces before quoted part, can replace : :\s*

/\benv:\s*(["'])((?:[^"'\\]+|(?!\1)["']|\\[\s\s])*)\1/g 

you have working pattern.

third: pattern optimization

a simple alternation:

using capture group , backreferences can seducing deal different type of quotes since allow write pattern in concise way. however, way needs create capture group , test lookahead in part (?!\1)["']`, not efficient. writing simple alternation increases pattern length , needs use 2 captures groups 2 cases more efficient:

/\benv:\s*(?:"((?:[^"\\]+|\\[\s\s])*)"|'((?:[^'\\]+|\\[\s\s])*)')/g 

(note: if decided must check 1 of 2 capture groups defined.)

unrolling loop:

to match content inside quotes use (?:[^"\\]+|\\[\s\s])* (for double quotes here) works can improved reduce amount of steps needed. unroll loop consists avoid alternation:

[^"\\]*(?:\\[\s\s][^"\\]*)* 

finally whole pattern can written this:

/\benv:\s*(?:"([^"\\]*(?:\\[\s\s][^"\\]*)*)"|'([^'\\]*(?:\\[\s\s][^'\\]*)*)')/g 

Comments

Popular posts from this blog

c++ - Creating new partition disk winapi -

Android Prevent Bluetooth Pairing Dialog -

php - joomla get content in onBeforeCompileHead function -