2016-07-26 1 views
0

J'essaie de faire correspondre des opérations mathématiques à l'aide d'une correspondance dans scala. Ainsi, la fonction sera en mesure de faire correspondre une chaîne comme « 5 + 2 » ou « log10 » ou « 10^5 », etc. Cependant le match ne garde pour les différents types d'expressionsCorrespondance des opérations mathématiques dans scala à l'aide de regex

def isValid(expression:String):Boolean={ 

    val number = """((\-|\+)?[0-9]+\.?[0-9])*""" 
    val operation = """([\+,\-,*,/,C,P])""" 
    val functions = """(log|ln|sin|cos|tan|arc sin|arc cos|arc tan|sec|csc|cot)""" 
    val powers = """\^"""+number 

    val arithmeticExpression = (number + operation + number).r 
    val functionExpression = (functions + number).r 
    val powerOperation = (number + powers).r 
    val stringToTest: Regex = ("""(""" +arithmeticExpression+"""|"""+functionExpression+"""|"""+powerOperation+""")""").r 

    expression match { 
     case arithmeticExpression(s) => true 
     case functionExpression(s) => true 
     case powerOperation(s)=>true 
     case _ => false 

    } 
} 


println(isValid("1+4").toString) 

Cependant si je correspondance pour une expression générale je reçois le résultat attendu:

def isValid(expression:String):Boolean={ 
    val number = """(\-|\+)?[0-9]+\.?[0-9]*""" 
    val operation = """[\+,\-,*,/,C,P]""" 
    val functions = """(log|ln|sin|cos|tan|arc sin|arc cos|arc tan|sec|csc|cot)""" 
    val power = """\^"""+number 
    val arithmeticExpression = number+operation+number 
    val functionExpression = functions+number 
    val powerExpression = number+power 

    val validExpression = """(""" +arithmeticExpression+"""|"""+functionExpression+"""|"""+powerExpression+""")""" 
    validExpression.r.findFirstIn(expression) match { 
     case Some(`expression`) => true 
     case None => false 
    } 

Répondre

1

vous ne faites pas correctement les numéros:

scala> arithmeticExpression.findFirstIn("1+4") 
res2: Option[String] = Some(+)      

scala> arithmeticExpression.unapplySeq("1+4") 
res3: Option[List[String]] = None 

scala> arithmeticExpression.unapplySeq("11+14") 
res4: Option[List[String]] = Some(List(11, null, +, 14, null)) 

Puisque vous nécessitant deux chiffres.

+0

Il existe des sites Web pour essayer des expressions rationnelles, qui sont difficiles à regarder et à composer. Ce serait bien s'il y avait une bibliothèque que vous pouviez charger dans le REPL pour séparer les expressions régulières, etc. Aussi, utilisez 'case r (_ *) =>' pour ignorer les groupes correspondants si vous n'êtes pas intéressé par eux. –

+0

Oui, la parenthèse a foiré l'expression. Merci! – Dguye

0

Le "()" dans l'expression régulière pour les nombres affectait le résultat. Aussi/^ nécessaire pour envelopper(). Cela a fini par travailler pour moi.

def isValid(expression:String):Boolean={ 
    val number = """[\-,\+]?[0-9]+\.?[0-9]*""" 
    val operation = """([\+,\-,*,/,C,P])""" 
    val functions = """(log|ln|sin|cos|tan|arc sin|arc cos|arc tan|sec|csc|cot)""" 
    val powers = """(\^)"""+number 
    val arithmeticExpression = (""""""+number + operation + number+"""""").r 
    val functionExpression = (functions + number).r 
    val powerOperation = (number + powers).r 
    val stringToTest: Regex = ("""(""" +arithmeticExpression+"""|"""+functionExpression+"""|"""+powerOperation+""")""").r 

    expression match { 
     case arithmeticExpression(s) => { 
     println("Arithmetic Match") 
     true 
     } 
     case functionExpression(s) => { 
     println("Function Match") 
     true 
     } 
     case powerOperation(s)=>{ 
     println("Power Match") 
     true 
     } 
     case _ => false 

    } 
} 

Merci pour l'aide!

+0

Je ne pense pas que votre "numéro" RE est quitté. Il semble permettre ', 7.' (virgule-point-point) comme un nombre acceptable. Peut-être est-ce un peu plus près de ce qui est nécessaire: '" "" [- +]? \ D + (?: \. \ D +)? "" "' – jwvh

+0

Merci, je pensais que les symboles de [] devaient être séparés par des virgules – Dguye