Need pattern to match a polynomial (string) not enclosed in () and containing a multiplication or division operator.

Posted on 2014-11-04
Last Modified: 2014-11-11
I have the following pattern that matches string expressions not enclosed in () starting at the beginning of the string:


 String Expressions                                                                          Matches
 (2x/3m)                                                                                              No Match
 2x/3m                                                                                                2x/3m
 2x/3m*45*h                                                                                     2x/3m*45*h
 (2m*5/2z*p/3n)                                                                               No Match
 6m/3m+2x/3m*45*h-(2m*5/2z*p/3n)                                        No Match
 (2m*5/2z*p/3n)-6m/3m+2x/3m*45*h                                        No Match
 (2m*5/2z*p/3n)-6m/3m+2x/3m*45*h(2m*5/2z*p/3n)            No Match

What I need is a pattern that matches the first part of a string expression that is not enclosed in ()
 The following are some examples:

 String Expressions                                                                          Matches
 (2x/3m)                                                                                              No Match
 2x/3m                                                                                                2x/3m
 2x/3m*45*h                                                                                     2x/3m*45*h
 (2m*5/2z*p/3n)                                                                               No Match
 6m/3m+2x/3m*45*h-(2m*5/2z*p/3n)                                        6m/3m+2x/3m*45*h-
 (2m*5/2z*p/3n)-6m/3m+2x/3m*45*h                                        -6m/3m+2x/3m*45*h
 (2m*5/2z*p/3n)-6m/3m+2x/3m*45*h(2m*5/2z*p/3n)            -6m/3m+2x/3m*45*h

I had prior assistance on this but I failed to realize that the examples I gave did not cover all the possible combinations.  I think I've got them covered now.  Any advice is welcome.
Question by:NevSoFly
  • 5
  • 3
LVL 33

Expert Comment

ID: 40425735
And what's about  ((2m*5/2z*p/3n)-6m/3m+2x/3m*45*h) ?

Author Comment

ID: 40426153
Thanks for your response, but I don't understand your question.

If need be I can simplify my needs to just identifying the stings where all or part of the expressions are not inside ().  Then I can use code to process the string.  example:

 (2x/3m)                                                                                              No Match
  2x/3m                                                                                                Match
  2x/3m*45*h                                                                                     Match
  (2m*5/2z*p/3n)                                                                               No Match
  6m/3m+2x/3m*45*h-(2m*5/2z*p/3n)                                        Match
 (2m*5/2z*p/3n)-6m/3m+2x/3m*45*h                                         Match
  (2m*5/2z*p/3n)-6m/3m+2x/3m*45*h(2m*5/2z*p/3n)            Match

Author Comment

ID: 40426218
I have gotten the opposite result using \(([^()]*)\).  I just don't know how to reverse this.

 String Expressions                                                                           Matches
 (2x/3m)                                                                                              (2x/3m)
 2x/3m                                                                                                No Match
 2x/3m*45*h                                                                                     No Match  (2m*5/2z*p/3n)                                                                               (2m*5/2z*p/3n)
 6m/3m+2x/3m*45*h-(2m*5/2z*p/3n)                                        (2m*5/2z*p/3n)
 (2m*5/2z*p/3n)-6m/3m+2x/3m*45*h                                        (2m*5/2z*p/3n)
  (2m*5/2z*p/3n)-6m/3m+2x/3m*45*h(2m*5/2z*p/3n)           (2m*5/2z*p/3n)
Master Your Team's Linux and Cloud Stack!

The average business loses $13.5M per year to ineffective training (per 1,000 employees). Keep ahead of the competition and combine in-person quality with online cost and flexibility by training with Linux Academy.

LVL 33

Expert Comment

ID: 40426531
what is the purpose of the task? what do you intend to do with the matched expressions?

you now have a regex expression which is in no way verifiable and where you easily found some sample expressions where it doesn't work as expected. you would have the same situation if someone found a regex expression which would match correctly for the additional patterns you posted, but probably not the one ste5an has posted. so, you end with an overkill regex expression where you never will know whether it would fail or succeed.

in my opinion, regex is not suitable for to parse mathematical expressions of a non-trivial complexity.

math expressions normally were parsed by recursively dividing expressions into sub expressions and build an array of operations which contain of two operands and one operator.

for example the expression


would be parsed to

1:   p   3n  /
2: 6m 3m /
3: @2 2x  +
4: @3 3m /
5: @4 45  * 
6: @1 @5 -

Open in new window

where @x points to the x-th element of the array. with the array and known input parameters the expression easily could be calculated. it also could be turned back to a string expression which has all parentheses:



Accepted Solution

NevSoFly earned 0 total points
ID: 40427038
Thanks, you are absolutely right it was overkill and overly complicated.  I did however find a solution.  


I used  \(([^()]*)\) to test the input string for expressions enclosed in ().


I then replaced the match with "".


I used code to check if the length of the resulting string was >2 since 3 characters would make the simplest expression (eg. 1*1).


I then used ((?<!<)/)|(\*) to checked if the resulting string contained a multiplication sign or a division sign that wasn't part of an html tag.If the length was >2 and the resulting string contained a * or /(not in html tag) then the input string had to contain a polynomial not in ().
LVL 33

Expert Comment

ID: 40428171
hmm, I still don't get it..

Using your procedure, your (2m*5/2z*p/3n)-6m/3m+2x/3m*45*h will return  -6m/3m+2x/3m*45*h as rest.
My  ((2m*5/2z*p/3n)-6m/3m+2x/3m*45*h) has no rest term.

Author Comment

ID: 40430832
ste5an, I basically only needed to know if the expression had a subexpression that was not in ().
LVL 33

Expert Comment

ID: 40431081
In this case counting parenthesis is faster.

Author Closing Comment

ID: 40434591
This was the only solution I had.

Featured Post

Active Directory Webinar

We all know we need to protect and secure our privileges, but where to start? Join Experts Exchange and ManageEngine on Tuesday, April 11, 2017 10:00 AM PDT to learn how to track and secure privileged users in Active Directory.

Question has a verified solution.

If you are experiencing a similar issue, please ask a related question

This document covers how to connect to SQL Server and browse its contents.  It is meant for those new to Visual Studio and/or working with Microsoft SQL Server.  It is not a guide to building SQL Server database connections in your code.  This is mo…
Today I had a very interesting conundrum that had to get solved quickly. Needless to say, it wasn't resolved quickly because when we needed it we were very rushed, but as soon as the conference call was over and I took a step back I saw the correct …
Learn how to match and substitute tagged data using PHP regular expressions. Demonstrated on Windows 7, but also applies to other operating systems. Demonstrated technique applies to PHP (all versions) and Firefox, but very similar techniques will w…
Explain concepts important to validation of email addresses with regular expressions. Applies to most languages/tools that uses regular expressions. Consider email address RFCs: Look at HTML5 form input element (with type=email) regex pattern: T…

830 members asked questions and received personalized solutions in the past 7 days.

Join the community of 500,000 technology professionals and ask your questions.

Join & Ask a Question