On Fri, May 15, 2020 at 07:32:50PM -0700, Joseph Brenner wrote: > Regex engines by their nature care a lot about order, but I > occasionally want to relax that to match for multiple > multicharacter subpatterns where the order of them doesn't > matter. > > Frequently the simplest thing to do is just to just do multiple > matches. Let's say you're looking for words that have a "qu" a > "th" and also, say an "ea". This works: > > my $DICT = "/usr/share/dict/american-english"; > my @hits = $DICT.IO.open( :r ).lines.grep({/qu/}).grep({/th/}).grep({/ea/}); > say @hits; > # [bequeath bequeathed bequeathing bequeaths earthquake earthquake's > earthquakes]
Would something like this work for you? /^ <?before .* "qu" > <?before .* "th" > <?before .* "ea" > / > Where things get interesting is when you want a negated match of > one of the subpatterns. One of the things I like about the first > approach using multiple chained greps is that it's easy to do a > reverse match. What if you want words with "qu" and "th" but > want to *skip* ones with an "ea"? > > my @hits = $DICT.IO.open( :r > ).lines.grep({/qu/}).grep({/th/}).grep({!/ea/}); > # [Asquith discotheque discotheque's discotheques quoth] Maybe something like this? (note the "!" instead of "?") /^ <?before .* "qu" > <?before .* "th" > <!before .* "ea" > / G'luck, Peter -- Peter Pentchev r...@ringlet.net r...@debian.org p...@storpool.com PGP key: http://people.FreeBSD.org/~roam/roam.key.asc Key fingerprint 2EE7 A7A5 17FC 124C F115 C354 651E EFB0 2527 DF13
signature.asc
Description: PGP signature