You could do something like this:
$s = 'a1 1 2 1.0 1.1 1.2 1.3';; print grep defined, $s =~ m[([a-z]\d)\s+(\d)\s+(\d)(?:\s+(\d\.\d))?(?: +\s+(\d\.\d))?(?:\s+(\d\.\d))?(?:\s+(\d\.\d))?(?:\s+(\d\.\d))?(?:\s+(\ +d\.\d))?(?:\s+(\d\.\d))?(?:\s+(\d\.\d))?];; a1 1 2 1.0 1.1 1.2 1.3 $s = 'a1 1 2 1.0 1.1 1.2 1.3 1.4 1.5 1.6 1.7';; print grep defined, $s =~ m[([a-z]\d)\s+(\d)\s+(\d)(?:\s+(\d\.\d))?(?: +\s+(\d\.\d))?(?:\s+(\d\.\d))?(?:\s+(\d\.\d))?(?:\s+(\d\.\d))?(?:\s+(\ +d\.\d))?(?:\s+(\d\.\d))?(?:\s+(\d\.\d))?];; a1 1 2 1.0 1.1 1.2 1.3 1.4 1.5 1.6 1.7
Not elegant, but it works.
You'd probably want to generate the regex:
$re = '([a-z]\d)\s+(\d)\s+(\d)' . join '', '(?:\s+(\d\.\d))?' x 10;; $re = qr"$re";; $s = 'a1 1 2 1.0 1.1 1.2 1.3';; print grep defined, $s =~ $re;; a1 1 2 1.0 1.1 1.2 1.3 $s = 'a1 1 2 1.0 1.1 1.2 1.3 1.4 1.5 1.6 1.7';; print grep defined, $s =~ $re;; a1 1 2 1.0 1.1 1.2 1.3 1.4 1.5 1.6 1.7
In reply to Re: validate variable-length lines in one regex?
by BrowserUk
in thread validate variable-length lines in one regex?
by uhClem
| For: | Use: | ||
| & | & | ||
| < | < | ||
| > | > | ||
| [ | [ | ||
| ] | ] |