I'm struggling to match a pattern in regex that simulate a nested tree with words separated by dots, and leaf node separated by "->" or not.
It should start with "$".
words should be formed by \w{1,32} only
I'm using javascript
ex:
$any.number.of.words.followed.by.dot.and.final.word.followed.by.arrow.or->not
$root.f1.f2->col4 -OK (complete)
$f4.folder7 -OK (do not have the leaf node)
$f1->col7 -OK (just root and leaf node)
$root.g5.tt.dd...bbh.hht.sdwswsw->col7 -NOK ("..." is wrong)
$.ferf->45 -NOK (words should have at least one \w)
$$e.fe.45 - NOK (starts with $$)
$feefefefefefefefe -NOK (should have at least one "." or "->"
My goal is to have 2 patterns, one that includes leaf node (->), and one without it
without leaf node: /\$[\w \.] /
with leaf node: /\$[\w \.] ->\w /
It works for the most of the cases, but it fails to identify NOK examples above.
My real question is how I define a short pattern to repeat using quantifiers ? when I use quantifiers, it always consider repetition of the last symbol
How to find repetition for the following pattern ? \w{1,32}.\{1}
CodePudding user response:
For a single pattern for both variations, you can optionally repeat the dots and the word chars, and optionally match the ->
and word chars, or match only the ->
part
^\$\w{1,32}(?:(?:\.\w{1,32}) (?:->\w{1,32})?|->\w{1,32})$
^
Start of string\$\w{1,32}
Match$
and 1-32 word chars(?:
Non capture group(?:\.\w{1,32})
Match 1 repetitions of.
and 1 - 32 word chars(?:->\w{1,32})?
Optionally match->
and word chars|
Or->\w{1,32}
Match->
and word chars
)
Close non capture group$
End of string
A separate pattern without a leaf node, where there are 1 repetitions of a dot and word characters till the end of string
^\$\w{1,32}(?:\.\w{1,32}) $
A separate pattern with a leaf node, where there are optional repetitions of a dot and word characters and a mandatory ->
part:
^\$\w{1,32}(?:\.\w{1,32})*->\w{1,32}$