我想使用自定义命令在自定义字母表上进行正则表达式匹配。目的是研究气象学中出现的方程式和表达式。
所以例如我的alpabet是[p, rho, u, v, w, x, y, z, g, f, phi, t, T, +, -, /]
注意:rho和phi是多个字符,应该被视为单个字符。
我还想使用自定义命令,例如变量\v
,即不是算术运算符。
我想使用其他命令,例如(\v).
,请注意点应与dx/dt
匹配,其中x
是变量。同样地,给定p=p(x,y,z)
,p'
将匹配dp/dx
,dp/dy
和dp/dz
,但不匹配dp/df
。 (某处会有p = p(x,y,z)
)。
我也希望能够回溯。
现在,我已经用D调查了PCRE和ragel,我发现前两个问题是可解的,多个角色对象被定义为固定对象。而不是一个角色类。
但是我如何解决第三个问题?
我没有看到PCRE或RAGEL承认使用自定义命令的方法。 此外,由于我想使用回溯,我不确定Ragel是否是正确的选项,因为这个wouuld需要一个堆栈,这意味着我将使用CFG。
是否可能是一种域特有的语言来构建这样的regex / cfg机器(如果重要的话,对于linux 64位)
答案 0 :(得分:1)
没有什么是不可能的。用编程语言编写带有正则表达式的新类并定义新语法。它将是您的个人正则表达式语法。例如,像:
result = latex_string.match("p'(x,y,z)", "full"); // match dp/dx, dp/dy, dp/dz
result = latex_string_array.match("p'(x,y,z)", "partial"); // match ∂p/∂x, ∂p/∂y, ∂p/∂z
. . .
方法match
将在您的类中处理新的伪正则表达式,并以理想的形式返回结果。您可以简单地将输入定义作为字符串和/或数组形式。实际上,如果某些函数必须与所有衍生函数匹配,则必须将搜索符号简化为.match("p'")
。
一个简单的通知:
,
有来源:\mathrm{d}y=\frac{\mathrm{d}y}{\mathrm{d}t}\mathrm{d}t
,并且:
,
dy=\frac{dy}{dt}dt
,最后:
,
是dy=(dy/dt)dt
具有正则表达式的乳胶方程的推广问题是人为输入因子。它只是一个符号,作者可以选择各种输入方式。
最好和最精确的方法是分析公式内容并创建计算三。在这种情况下,您不仅会搜索差异或派生词的符号,还会搜索计算差异和派生词的说明,但无论如何它都与详细分析公式字符串有多种写作方式。
还有一件事,对你来说是个好消息!没有必要定义魔法正则表达式乳胶多字节字母希腊字母表。 UTF-8可以在用户界面中使用ρ - GREEK SMALL LETTER RHO
,但在搜索方法中将其视为\rho
,并使用/\\frac{d\\rho}{dx}/
正则表达式。
还有一个例子:
// search string
equation = "dU= \left(\frac{\partial U}{\partial S}\right)_{V,\{N_i\}}dS+ \left(\frac{\partial U}{\partial V}\right)_{S,\{N_i\}}dV+ \sum_i\left(\frac{\partial U}{\partial N_i}\right)_{S,V,\{N_{j \ne i}\}}dN_i";
. . .
// user input by UI
. . .
// call method
equation.equation_match("U'");// example notation for all types of derivatives for all variables
. . .
// inside the 'equation_match' method you will use native regex methods
matches1 = equation.match(/dU/); // dU
matches2 = equation.match(/\\partial U/); // ∂U
etc.
return(matches);// combination of matches