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

I have the following pattern that matches string expressions not enclosed in () starting at the beginning of the string:

^[^(]*?((((-?\d+(?:\.\d*)?)(<sup>(-?\d+)</sup>)?(<sup>E[-+]\d+</sup>)?(-?[a-z]((<sup>-?\d+</sup>)|(<sup>E[-+]\d+</sup>)?))?|(-?[a-z]((<sup>-?\d+</sup>)|(<sup>E[-+]\d+</sup>)?)))[*|/])+)(?!\*\/)((-?\d+(?:\.\d*)?)(<sup>(-?\d+)</sup>)?(<sup>E[-+]\d+</sup>)?(-?[a-z]((<sup>-?\d+</sup>)|(<sup>E[-+]\d+</sup>)?))?|(-?[a-z]((<sup>-?\d+</sup>)|(<sup>E[-+]\d+</sup>)?)))[^)]*$

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)                                        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.
NevSoFlyAsked:
Who is Participating?

[Product update] Infrastructure Analysis Tool is now available with Business Accounts.Learn More

x
I wear a lot of hats...

"The solutions and answers provided on Experts Exchange have been extremely helpful to me over the last few years. I wear a lot of hats - Developer, Database Administrator, Help Desk, etc., so I know a lot of things but not a lot about one thing. Experts Exchange gives me answers from people who do know a lot about one thing, in a easy to use platform." -Todd S.

ste5anSenior DeveloperCommented:
And what's about  ((2m*5/2z*p/3n)-6m/3m+2x/3m*45*h) ?
NevSoFlyAuthor Commented:
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
NevSoFlyAuthor Commented:
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)
CompTIA Network+

Prepare for the CompTIA Network+ exam by learning how to troubleshoot, configure, and manage both wired and wireless networks.

sarabandeCommented:
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

p/3n-(6m/3m+2x)/3m*45

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:

(p/3n-((((6m/3m)+2x)/3m)*45))

Sara
NevSoFlyAuthor Commented:
Sara,
Thanks, you are absolutely right it was overkill and overly complicated.  I did however find a solution.  

1.

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

2.

I then replaced the match with "".

3.

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).

4.

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 ().

Experts Exchange Solution brought to you by

Your issues matter to us.

Facing a tech roadblock? Get the help and guidance you need from experienced professionals who care. Ask your question anytime, anywhere, with no hassle.

Start your 7-day free trial
ste5anSenior DeveloperCommented:
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.
NevSoFlyAuthor Commented:
ste5an, I basically only needed to know if the expression had a subexpression that was not in ().
ste5anSenior DeveloperCommented:
In this case counting parenthesis is faster.
NevSoFlyAuthor Commented:
This was the only solution I had.
It's more than this solution.Get answers and train to solve all your tech problems - anytime, anywhere.Try it for free Edge Out The Competitionfor your dream job with proven skills and certifications.Get started today Stand Outas the employee with proven skills.Start learning today for free Move Your Career Forwardwith certification training in the latest technologies.Start your trial today
Regular Expressions

From novice to tech pro — start learning today.