嵌套标记/函数的正则表达式

时间:2013-05-19 16:27:59

标签: regex

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

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

在我的测试中,我使用连字符代替括号而不使用$ -sign。这更容易阅读。因此,测试期间的功能是lower-sometext-

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

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

我读它如下:

  • 找到单词upperlower
  • 后跟连字符
  • 后跟任何不是单词upperlower,连字符,随机数字和连字符
  • 的内容
  • 接着是一个大人物。

但这甚至不会接受lower-sometext-。我尝试了不同的事情超过2个小时,但我无法理解......

1 个答案:

答案 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方法。这个函数的结果总是一个文字,永远不会包含一个函数。此外,它的扩展性非常好。