I'm creating an input mask used to for the length of items. This input will convert to a "proper" format on blur but it should accept numbers, decimals, spaces, single quotes, double quotes and / for fractions (no letters).
I've got an okay start, but I'm no regex master and feel I'm complicating my pattern too much. So the following values are allowed:
5 6 (feet and inches separated by spaces)
5'6" (feet and inches in the correct format)
5.2 6 (decimal feet separated by spaces)
5.2'6" (decimal feet in the correct format)
5 6.1 (decimal inches separated by spaces)
5'6.1" (decimal inches in the correct format)
5.2 6.1 (decimal feet and inches separated by spaces)
5.2'6.1" (decimal feet and inches in the correct format)
5 6 1/2 (any combination above followed by a space and fraction)
5.2'6.1 1/2" (again with decimals)
78" (only inches)
78.4" (only inches with a decimal)
Rather picky, I know. I've got something that's a work in progress and I've broken it down to be more readable (to myself at least). http://jsfiddle.net/t37m0txu/383/
// allow numbers
var p_num = "[0-9]";
// numbers are up to 9 characters (it needs a range, for some reason)
var p_range = "{0,9}";
// allow a single decimal
var p_dec = "([.]{0,1})";
// allow a single space (needs to happen only if not directly followed by a decimal)
var p_space = "([ ]{0,1})";
// numbers, possible single decimal and/or space
var p_base = p_num + p_range + p_dec + p_space;
// only allow a single/double quote after a number
var p_afternum = "?(?=" + p_num + ")";
// allow a single or double quote
var p_quote = "(\'(0?" + p_base + ")?\|\"$)";
// issues:
// i do not need a range/cap on numbers
// after using decimal or space - only one number is allowed to follow (do not cap the range on numbers, only decimal/space)
// do not allow a space directly following a decimal
// do not allow a decimal directly following a single or double quote
var ex = "(" + p_base + ")" + p_afternum + p_quote + "(0?" + p_base + ")?\""