in reply to how to write multi-line regex
G'day herman4016,
You're reading the input line by line; accordingly, your regex is only trying to match against the single line in $_ for any given iteration of the while loop.
What you need to do is read the input in records. You can do this by locally setting $/, the input record sparator (see "perlvar: Variables related to filehandles").
You didn't post your data in <code>...</code> tags (in fact, you appear to have "<p>...</p>" tags with embedded "<br />" tags and what looks like extraneous whitespace), so I'm having to guess what it really looks like. In the script below, I've assumed paragraph mode (records are separated by two or more blank lines) but maybe "ENDEL;" might be a better end-of-record indicator.
You have an additional problem in your posted regex with greedy matches (e.g. " .*"). If you don't understand that, see Quantifiers under "perlre: Regular Expressions".
The following script shows the technique you'll need. You may need to adjust this based on my various comments above.
#!/usr/bin/env perl -l use strict; use warnings; my $re = qr{TEXT;\s+LAYER 13[1-7];\s+TEXTTYPE 0;.*?STRING ([^;]+)}s; { local $/ = ""; while (<DATA>) { print $1 if /$re/; } } __DATA__ ... ... TEXT; LAYER 133; TEXTTYPE 0; PRESENTATION 0,2,0; STRANS 0,0,0; XY 1; X: 91410; Y: 50020; STRING AVDD12; ENDEL; BOUNDARY; LAYER 108; DATATYPE 0; XY 5; X: 0; Y: 0; X: 0; Y: 53530; X: 91410; Y: 53530; X: 91410; Y: 0; X: 0; Y: 0; ENDEL; ... ...
Output:
AVDD12
-- Ken
|
|---|
| Replies are listed 'Best First'. | |
|---|---|
|
Re^2: how to write multi-line regex
by herman4016 (Acolyte) on Mar 24, 2014 at 09:08 UTC |