I am trying to find an efficient way to match words that can contain digits at any point, but not pure numbers. In a simple example I can do this as follows:
The output is " 87", as desired.#!/usr/bin/perl use strict; use warnings; my $string = "foo 1foo foo2 3foo4 foo5bar 87"; $string =~ s/\d*[a-z]\d*//g; print "$string\n";
The problem just gets ugly quickly, as I like to allow words to contain minus signs, underscores, umlauts, and so on. A more complex example would be:
which results in " ; () 87 - _ !@#$%".#!/usr/bin/perl use strict; use warnings; my $string = 'foo 1foo; foo_2 foo-bar() 87 - _ !@#$% '; my $optional = qr/[\d_-]/; my $mandatory = qr/[a-zA-Z]/; $string =~ s/$optional*$mandatory$optional*//g; print "$string\n";
I am asking more generally:
Is there a way to a create a regular expression character class that has some mandatory and optional members? What would be your way to match (not necessarily replace) these "words"?
Further down the road the actual task is to find the position of the next "word".
In reply to Regex matching words with numbers, but not numbers. by lplo
| For: | Use: | ||
| & | & | ||
| < | < | ||
| > | > | ||
| [ | [ | ||
| ] | ] |