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

Posted on 2014-11-04
Medium Priority
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
Welcome to Experts Exchange

Add your voice to the tech community where 5M+ people just like you are talking about what matters.

  • Help others & share knowledge
  • Earn cash & points
  • Learn & ask questions
  • 5
  • 3
LVL 35

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)
What does it mean to be "Always On"?

Is your cloud always on? With an Always On cloud you won't have to worry about downtime for maintenance or software application code updates, ensuring that your bottom line isn't affected.

LVL 35

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 35

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 35

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

Free Tool: Port Scanner

Check which ports are open to the outside world. Helps make sure that your firewall rules are working as intended.

One of a set of tools we are providing to everyone as a way of saying thank you for being a part of the community.

Question has a verified solution.

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

The ECB site provides FX rates for major currencies since its inception in 1999 in the form of an XML feed. The files have the following format (reducted for brevity) (CODE) There are three files available HERE (http://www.ecb.europa.eu/stats/exch…
A long time ago (May 2011), I have written an article showing you how to create a DLL using Visual Studio 2005 to be hosted in SQL Server 2005. That was valid at that time and it is still valid if you are still using these versions. You can still re…
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…
Suggested Courses

764 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