在C#中,将分层字符串拆分为两个特殊字符



我使用的是类似的字符串

$upper('anothervalue')$

我编写了一个解析器,可以很好地使用下面的代码解析此语句。

但是,现在另一个系统正在发送一个复杂的字符串,比如(我可以得到任何数量的链式字符串(:

$upper($trim('somevalue')$)$ - $upper('anothervalue')$

如何以特定顺序循环遍历分层数据以评估函数(从最内部的匹配开始(:

$trim('somevalue')$——我将对此进行评估,比如将其存储在变量x

$upper(x)$——现在用上一条语句的结果来计算上限

$upper('anothervalue')$

private static object EvaluateFunctionsInJson(string jsonValue)
{
object origJsonValue = jsonValue;
var fnMatches = Regex.Matches(jsonValue.ToString(), @"$(.+?)$");
var fnCount = fnMatches.Count;
foreach (var fnMatch in fnMatches)
{
// call another method to evaluate the function
object replaceValue = EvaluateFunction(fnMatch.ToString());
if (fnCount > 1)
{
origJsonValue = origJsonValue.ToString().Replace(fnMatch.ToString(), replaceValue.ToString());
}
else
{
origJsonValue = replaceValue;
}
}
return origJsonValue;
}

private static object EvaluateFunction(string jsonValue)
{
var functionWithoutDollarSign = Regex.Replace(jsonValue.ToString(), @"[$$]+", "");
string functionName = Regex.Match(functionWithoutDollarSign, @"b[A-Za-z]+b", RegexOptions.Singleline).Value; //get the first word
var functionParam = Regex.Match(functionWithoutDollarSign, @"(([^)]*))").Value; //get the text between paranthesis
var functionParamWithoutParanthesis = Regex.Replace(functionParam.ToString(), @"[()]+", "");
var funcParams = functionParamWithoutParanthesis.Split(',');
var value = funcParams[0];
switch (functionName.ToLower().Trim())
{
case "upper":
return value.ToUpper();
case "lower":
return value.ToLower();
case "number":
return Convert.ToInt64(value);
case "boolean":
return Convert.ToBoolean(value);
default:
return value;
}
}

您可以使用

using System;
using System.Collections.Generic;
using System.IO;
using System.Linq;
using System.Text.RegularExpressions;
public class Test
{
public static void Main()
{
var text = "$upper($trim('somevalue   ')$)$ - $upper('anothervalue')$";
var pattern = @"(?s)$(?<functionName>w+)('?(?<value>[^'\]*(?:\.[^'\]*)*)'?)$";
var prev = string.Empty;
do {
prev = text;
text = Regex.Replace(text, pattern, x => {
switch (x.Groups["functionName"].Value.ToLower().Trim())
{
case "trim":
return x.Groups["value"].Value.Trim();
case "upper":
return x.Groups["value"].Value.ToUpper();
case "lower":
return x.Groups["value"].Value.ToLower();
case "number":
return Convert.ToInt64(x.Groups["value"].Value).ToString();
case "boolean":
return Convert.ToBoolean(x.Groups["value"].Value).ToString();
default:
return x.Groups["value"].Value;
}
});
} while (prev != text);
Console.WriteLine(text);
}
}

请参阅联机C#演示。

正则表达式是

(?s)$(?<functionName>w+)('?(?<value>[^'\]*(?:\.[^'\]*)*)'?)$

请参阅在线regex演示详细信息

  • (?s)-一个RegexOptions.Singleline内联正则表达式选项,使.与包括换行符在内的任何字符匹配
  • $-美元符号
  • CCD_ 11-组";functionName":一个或多个单词字符
  • (-一个(字符
  • '?-可选的'字符
  • CCD_ 16-组";值":除了'之外的零个或多个字符,然后出现零个或更多的任何转义字符,然后是除了'之外的0个或更多个字符
  • '?)-'))字符串
  • $

do {...} while (prev != text)搜索并替换text变量中的匹配项,直到找不到匹配项为止。

相关内容

  • 没有找到相关文章

最新更新