in reply to validate variable-length lines in one regex?
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
|
|---|
| Replies are listed 'Best First'. | |
|---|---|
|
Re^2: validate variable-length lines in one regex?
by uhClem (Scribe) on Jul 06, 2015 at 18:59 UTC | |
by BrowserUk (Patriarch) on Jul 06, 2015 at 19:20 UTC |