re = /^(=?202\d)(\d{0,3}[A-Z]{1,4}|[A-Z]{1,4}\d{1,3})([\dA-Z]{0,4})A/m
str = 'Matches R1 R2 R3 R4 R5 R6
2022A144A OK OK OK OK \\D\\d\\d\\d
20228BC3A OK OK OK OK \\d\\D\\D\\d
20228Z1DA OK OK OK OK \\d\\D\\d\\D
2022K2 A
20229999A NOK \\d\\d\\d\\d
2022B123A OK OK OK OK \\D\\d\\d\\d
20221B23A OK OK OK OK \\d\\D\\d\\d
202212B3A NOK NOK NOK OK OK \\d\\d\\D\\d
2022123BA NOK OK \\d\\d\\d\\D
2022ABCDA
2022K2 A
Matches 100% as desired
R 12 2022(\\d\\D\\w\\w|\\D\\d\\w\\w|\\d\\d\\D\\w|\\d\\d\\w\\D|\\D\\D\\D\\D)A
R 13 ^(=?202\\d)(\\d{0,3}[A-Z]{1,4}|[A-Z]{1,4}\\d{1,3})([\\dA-Z]{0,4})A
Should match
R1: 2022\\d\\D\\w\\wA
R2: 2022\\D\\d\\w\\wA
R3: 2022(\\d\\D\\w\\w|\\D\\d\\w\\w)A
R4: 2022(\\d\\D\\w\\w|\\D\\d\\w\\w|\\d\\d\\D\\w)A
R5: 2022(\\d\\D\\w\\w|\\D\\d\\w\\w|\\d\\d\\D\\w|\\d\\d\\w\\D)A
R 10 ^(=?202\\d)(\\d*[A-Z]|[A-Z]*)([\\dA-Z]{1,3})A
R 11 ^(=?202\\d)(\\d{1,3}[A-Z]*)([\\dA-Z]{1,3})A
R 12 ^(=?202\\d)(\\d{1,3}[A-Z]{1,3}|[A-Z]{1,3}\\d{1,3})([\\dA-Z]{0,3})A
^ Start of string
(?=[a-z\\d]{8,}$) Positive lookahead, assert 8 or more chars a-z or digits till end of string
(?=\\d*[a-z]) Positive lookahead to assert at least a char a-z
[a-z]* Match optional chars a-z
\\d Match at least a single digit
[a-z\\d]* Match optional chars a-z or digits
$ End of string
Should not match
R6: 2022([A-Z0-9]{1,4})A
R7: 2022(\\d|\\w){1,3}\\wA <-- also matches 20229999A which it should not
R8: 2022\\w\\w\\s\\sA
R9 2022\\d\\d\\d\\dA'
# Print the match result
str.scan(re) do |match|
puts match.to_s
end
Please keep in mind that these code samples are automatically generated and are not guaranteed to work. If you find any syntax errors, feel free to submit a bug report. For a full regex reference for Ruby, please visit: http://ruby-doc.org/core-2.2.0/Regexp.html