Needs example RegExp #32

coolaj86 opened this Issue Jun 13, 2012 · 12 comments

6 participants


For convenience the regular expression that parses a valid semver should be made available on the homepage.



UPDATE: I think I've collected all of the comments and edge cases to produce a regex and test cases that are in accordance with the spec.

See test cases in JavaScript:


I'm using this one for Ruby:


Those are both wrong (in that they will "parse" illegal values). The Javascript regex will allow v2.0.0+-build.acebfde1284 and the Ruby regex would allow v2.0.0-build.acebfde1284+build.acebfde1284. In both cases, a true alternation is required to permit either a hyphen or a plus sign, but not both (and either extra bit is optional).


@JohnPeacock I thought that both were allowed to coexist:

"A pre-release version MAY be denoted by appending a dash (...)"
"A build version MAY be denoted by appending a plus sign (...) immediately following the patch version or pre-release version."


@JohnPeacock that's exactly why there needs to some canonical regexes on the main page.


The spec indicates that pre-release and build version may coexist. The following excerpt from paragraph 12

1.0.0-rc.1 < 1.0.0-rc.1+build.1

indicates that the a version with just a pre-release is lower in precedence than the same string with a build appended.

I don't disagree that a canonical regexp would be helpful, however.


Here's my attempt at this:


It validates all of the examples listed on the website at this time.

EDIT: I agree with @jlfaber, so I removed the option to support the optional "v" prefix.



Perhaps I've missed something, but I don't see anything in the spec that says a leading 'v' is permitted. Lots of folks prefix their versions with a v, of course, but if we're trying to document the spec itself, I don't think that should be there.

Here's what I've been using. Note that I've included "capture" parens to return the base, pre-release, and build components.


@jlfaber All of your parens are capturing groups though so you end up capturing all sorts of things that I assume you don't wish to... You should use non-capturing groups for those you don't wish to be captured:


Given '2.0.0-rc.1+build.123' that will only capture '2.0.0', 'rc.1' & 'build.123'.
using non-capturing groups will probably also speed up the regex engine.


@Omnikron13 Nice, it also accounts for trailing decimal points. I'll be borrowing this!


@Omnikron13 Good catch on the non-capturing groups. Thanks!


In order for sorting to work predictably we have to allow


but disallow


UPDATE: Nevermind, I see that 1.0.0+build.1-rc.1 would only have a build, as - is an allowable identifier and that the following would still be unambiguous


Hi @coolaj86 great idea! This is the repository for the spec. Would you mind submitting this as a pull request over at the website repository?

We need to consider a nice way to present this information. Should it go in the FAQ or perhaps add a "more info" link to the top header to a page that has this and other information such as links to translations.


@Haacked Haacked closed this Mar 13, 2013
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment