2

我正在创建一个程序,其中提供了一些用户可以输入的功能。$upper(string)假设我有一个函数可以使用 function和function 将字符串转换为大写$lower(string)。用户可以在文本框中输入这些内容,同时使用占位符插入内容(例如,%T 表示歌曲的标题)。使用占位符和函数,用户可以输入完整的命名模式。

函数可以嵌套,我想先执行最里面的函数。现在我正在寻找一个正则表达式来识别它。在英语中,我正在寻找a function (and its value) that does not contain another function.

在我的测试中,我使用连字符而不是括号并且没有 $ 符号。这更容易阅读。所以测试期间的功能是lower-sometext-.

到目前为止,这是我的猜测:

(lower|upper)-(?!((lower|upper)-.*-))-

我是这样读的:

  • 找到单词upperor lower,
  • 后跟一个连字符,
  • 后跟任何不是单词upperor lower、连字符、随机数的随机字符和连字符
  • 紧随其后的是一个炒作。

但这甚至不会接受lower-sometext-。我正在尝试不同的事情超过 2 个小时,但我无法弄清楚......

4

1 回答 1

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()调用该值的执行方法之前。这个函数的结果总是一个字面量并且永远不会包含一个函数。此外,它的扩展性非常好。

于 2013-05-20T03:09:49.903 回答