Anonymous Monk has asked for the wisdom of the Perl Monks concerning the following question:

Hi Monks, I need some help writing a regular expression for the first time.
Im writing a program that evaluates simple maths equations, e.g. (a + 13) * (b - 10 ) / c
I want to be able to read an input like above and get the variables used. Obviously if a variable appears twice I only want it once. I thought something like match \w?+.
Thanks for your help!

Replies are listed 'Best First'.
Re: regular expression math equations
by liverpole (Monsignor) on Nov 20, 2006 at 14:54 UTC
    Not quite \w?+ (which could be \w+ just as easily), as that gives you digits as well, which it sounds like you don't want.  Instead, use [a-z]+, which matches against variable names (alpha only, in this case).  The /gi lets you match all occurrences (g = global) without regard for case (i = ignore case).

    If you have to match alphanumerics (eg. a7), then use something like ([a-z]\w*0) instead.

    Of course, any problem requiring unique results just shouts out for a hash.

    You could try something like this:

    use strict; use warnings; + print "Enter expression: "; chomp(my $expr = <STDIN>); + my @vars = ($expr =~ /([a-z]+)/gi); my %unique = map { $_ => 1 } @vars; + printf "Unique variables: %s\n", join(',',keys %unique);

    s''(q.S:$/9=(T1';s;(..)(..);$..=substr+crypt($1,$2),2,3;eg;print$..$/
      Whether the [a-z]+ is appropriate depends on the context of the equation, and whether variables can have multiple characters. In a C program 'xy' is a variable named xy, but in a math equation it is likely to mean x times y.
Re: regular expression math equations
by kwaping (Priest) on Nov 20, 2006 at 14:55 UTC
    my $text = "(a + 13) * (b - 10 ) / c"; # select all individual alpha characters my @vars = ($text =~ /[a-zA-Z]/g); # get uniques out of the array my %hash; map { $hash{$_}++ } @vars; my @unique_vars = keys %hash;
    Of course, this solution is based on the assumption that your variables are always going to be a single a-z character (based on your example). Also, a small side-benefit of this code is that the values of %hash will tell you how many times a particular variable was found in the equation.

    ---
    It's all fine and dandy until someone has to look at the code.