使用正则表达式处理文本,其实还可以有算术表达式,像正则表达式一样。他们的共同点是,先编译再执行。总的来说,有七种类型:
①直接出结果
②f()
③f(str)
④f(regex)
⑤f(str,regex)
⑥动态的,运行时编译
⑦使用全局变量g,f()
其中,①③⑤是常用的,④⑦是不常用的。
对于①,直接出结果,它是"1+2*3"之类的算数表达式,在程序的编译阶段直接替换为7。
对于②f(),它可以编译成无参数的函数,例如"rand ()"。
对于③f(str),这是有变量做参数的情况,多数正则表达式是这样的,需要输入待匹配的句子正则才能运行。或是"x^2+1",需要输入x才能得到结果,这个算术表达式在编译阶段被编译成函数f(x),待到执行阶段再运行。
对于④f(regex),这是传递函数指针做参数,在一个正则表达式中引用另一个正则,或是在一个算术表达式中引用一个外部函数。
对于⑤f(str, regex),它结合了③和④。
对于⑥,动态的,运行时编译。这是现有的正则表达式的标准做法,但是不总是需要这么做的,除非在运行时输入一串正则,这就没办法在编译时处理了,只能在运行时处理。或者是做一个计算器程序,在运行时接收算术表达式。
对于⑦,使用全局变量,这件事的出现概率不大,但却是编程语言支持的。
上述七种情况,是正则表达式和算术表达式在编译执行时出现的。
另外,现有的编程语言普遍能处理算术运算,以至于我们忽略了,应该像使用正则表达式那样,使用算术表达式。正则表达式是一门微型语言,其实算术表达式也是一门微型语言,只不过我们太熟悉它,才认为它是编程语言的一部分。
现有的正则表达式引擎,完全是运行时编译。我还记得做过的一个qt项目,使用了正则,但是编译正则的语句被放到了循环体里,导致效率严重降低。那个正则完全是静态的,可以在编译程序时一起编译,结果是f(str),等运行时就快多了。