[Webinar] Streamline your web hosting managementRegister Today

x
  • Status: Solved
  • Priority: Medium
  • Security: Public
  • Views: 196
  • Last Modified:

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.
0
NevSoFly
Asked:
NevSoFly
  • 5
  • 3
1 Solution
 
ste5anSenior DeveloperCommented:
And what's about  ((2m*5/2z*p/3n)-6m/3m+2x/3m*45*h) ?
0
 
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
0
 
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)
0
The new generation of project management tools

With monday.com’s project management tool, you can see what everyone on your team is working in a single glance. Its intuitive dashboards are customizable, so you can create systems that work for you.

 
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
0
 
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 ().
0
 
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.
0
 
NevSoFlyAuthor Commented:
ste5an, I basically only needed to know if the expression had a subexpression that was not in ().
0
 
ste5anSenior DeveloperCommented:
In this case counting parenthesis is faster.
0
 
NevSoFlyAuthor Commented:
This was the only solution I had.
0

Featured Post

Free Tool: ZipGrep

ZipGrep is a utility that can list and search zip (.war, .ear, .jar, etc) archives for text patterns, without the need to extract the archive's contents.

One of a set of tools we're offering as a way to say thank you for being a part of the community.

  • 5
  • 3
Tackle projects and never again get stuck behind a technical roadblock.
Join Now