In particular, is this possible with Javascript?
>> "Version 1.2.3.4".match(/\S+ (\d+)(\.\d+)*/)
["Version 1.2.3.4", "1", ".4"]
It’s obvious $2 gets set to the last Kleene-“match”. Is there no built-in method to retrieve the rest (".2", ".3")?
If this cannot be done easily in JS, could Perl do it?
UPDATE: Many of the answers so far have been “workarounds” which work because of the simplicity of my example. If the part that repeated that I wanted to match was more than just a number, they wouldn’t work.
However, a very valid solution does exist: use /expr/g global regex matching: just filter out the parts that repeat and use that. I find this to be somewhat less flexible than the more generally applicable * operator but it will obviously get the job done in most cases.
Regex in JavaScript, like most other regex flavors, only captures the last value of the capturing group if it is matched repeatedly. The only well known regex lib (that I know of) where you get access to all of the previous matched captures is the one in .NET.
So no, you can’t do this in JS.
In Perl there are a couple of ways you can accomplish such things. One of the more elegant is probably to use
\G(which works in PCRE too).For example:
Returns (in list context):