我正在创建一个程序,我提供了一些可以由用户输入的功能。假设我有一个函数将字符串转换为大写字母,函数为$upper(string)
,函数为$lower(string)
。用户可以在文本框中输入这些内容,同时使用占位符插入内容(例如,歌曲标题的%T)。使用占位符和函数,用户可以输入完整的命名模式。
函数可以嵌套,我想先执行最内层函数。现在我正在寻找一个正则表达式来识别它。在英语中,我正在寻找a function (and its value) that does not contain another function.
在我的测试中,我使用连字符代替括号而不使用$ -sign。这更容易阅读。因此,测试期间的功能是lower-sometext-
。
到目前为止,这是我的猜测:
(lower|upper)-(?!((lower|upper)-.*-))-
我读它如下:
upper
或lower
,upper
或lower
,连字符,随机数字和连字符但这甚至不会接受lower-sometext-
。我尝试了不同的事情超过2个小时,但我无法理解......
答案 0 :(得分:1)
使用不同的方法:不是首先查找最内层函数,而是从最外层函数开始 - 并递归地解析其值。
因此对于字符串upper(lower(sometext))
,您首先“处理”上部。但在实际应用ToUpper()之前,您在其值上调用相同的函数 - 在本例中为lower(sometext)
。然后再次执行相同的操作:将ToLower()应用于值的执行函数的结果 - 在本例中仅为sometext
。由于它不包含函数,execute方法将返回sometext
并结束递归。
我在C#中创建了一个函数
public string execute(string text)
{
string pattern = @"(lower|upper)\((.*)\)";
Match m = Regex.Match(text, pattern);
if (m.Success)
{
switch (m.Groups[1].Value)
{
case "lower":
return execute(m.Groups[2].Value).ToLower();
case "upper":
return execute(m.Groups[2].Value).ToUpper();
default:
return null;
}
}
else
return text;
}
你可以用你的字符串调用函数:
string result = "upper(lower(sometext))";
再次:重要的部分在交换机内部:在调用ToLower()
或ToUpper()
之前,您调用值的execute方法。这个函数的结果总是一个文字,永远不会包含一个函数。此外,它的扩展性非常好。