With a string like {float: 'null', another: 'foo'}
, I’d like to grab each set of key/values pairs so that the groups would output float
null
, and another
and foo
.
My current regex is /{(?<set>(?<key>w*)s*:s*(?<value>.*)?s?)*}/g
It grabs the key correctly, but anything past from the comma on receives it as the value. I’m using named groups mainly just for clarity. Can’t figure out how to extract each key/value pair especially when there are multiple.
Thanks for any help
Currently am trying /{(?<set>(?<key>w*)s*:s*(?<value>.*)?s?)*}/g
but the output is:
the group ‘set’: float: 'null', another: 'foo'
(correct)
the group ‘key’: float
(correct)
the group ‘value’: 'null', another: 'foo'
(incorrect, I want just null
)
Would like it to capture all key/value pairs if possible
Edit for more clarity:
My specific use case is for parsing Markdown and plugging it into custom components in Svelte, where I want to control the ability to gather props from the markdown syntax on an image. From what I’ve gathered online about putting attributes on an image, it should look something like:
![Alt Text]https://<fullurl>.jpg "This is hover text"){prop1: 'foo', prop2: 'bar', float: true}
Reason for regex is parsing the markdown string. It’s not JSON, and I dont really gain anything by following JSON semantics ("
‘s on the key)
2
Answers
Have a go with this long JavaScript regex:
In action (view in full page, if not it’s not all visible):
The same regular expression, with comments, with the
x
flagthat PCRE offers:
Or better, on regex101, you’ll have the colours and the explanation
on the right column: https://regex101.com/r/bBPvUd/1
As mentioned in the comments,
eval()
is considered as "evil" or at least as unsafe. I have forgotten exactly why, something to do with cross-site-scripting. However, if it is used within a "safe" environment, i. e. for preprocessing of input that you have full control over, then it might be admissible nonetheless.Apart from being "unsafe", the above is not completely fail-safe, as property values containing the "}" character will cause problems …