cd ..

:~/Is it Math? with Regex


Occasionally, I write R shiny apps that allow users to input mathematical expressions. R then parses these expressions as R code. The problem with this is that without "sanitizing" the input, users can make my Shiny server execute all kinds of code I don't want. Here is a solution to parsing the input with regex to check that it only uses "allowed" functions.
check_math <- function(string){
  allowed_functions <- c("log","sin","min","max","")
  matches <- regmatches(string,gregexec("\\W(\\w)\\(.?\\)",string))
  matches <- matches[[1]][2,] 
  ok <- all(matches %in% allowed_functions)
  return(ok)
}
This code looks for all instances of some letters followed by a set of parentheses. It checks those matches against a list of allowed functions and returns TRUE only if all of them are in the allowed set. All uses of parentheses that are not preceeded by letters are allowed by including the empty string in the allowed functions.
check_math("x1^(2)*x2^(3) %>% rep(1,1000000)")
[1] FALSE 
check_math("x1^(2)*x2^(3)")
[1] TRUE